У меня есть класс, как это:синхронизирующие статические методы в том же классе
public class Utils {
public static void doSomething() {
// doSomething code
}
public static void doSomethingElse() {
// doSomethingElse code
}
}
Я хочу, чтобы эти два метода должны быть синхронизированы, но не синхронизированы друг с другом т.е. нет двух потоков может обрабатывать метод йоЗотеЬЫпд() в в то же время никакие два потока не могут обрабатывать doSomethingElse() одновременно, но нормально для потока обрабатывать метод doSomething(), а другой - обрабатывать метод doSomethingElse() в одно и то же время.
Я реализовал что-то вроде этого:
public class Utils {
private static final String DO_SOMETHING_LOCK = "DO_SOMETHING_LOCK";
private static final String DO_SOMETHING_ELSE_LOCK = "DO_SOMETHING_ELSE_LOCK";
public static void doSomething() {
synchronized(DO_SOMETHING_LOCK) {
// doSomething code
}
}
public static void doSomethingElse() {
synchronized(DO_SOMETHING_ELSE_LOCK) {
// doSomethingElse code
}
}
я вижу ответ Скотт Stanchfield использует подобный подход здесь:
How do synchronized static methods work in Java?
, но это лучший способ сделать это? Для меня это кажется неуклюжим, создавая два объекта, только для того, чтобы их можно было использовать для блокировки - есть ли лучший способ сделать это?
Почему массив ??? –
это на самом деле хуже, чем авторская версия, поскольку никто не знает, какой замок [0] должен защищать - у него нет имени. Единственный полезный момент - использовать новый Object(), а не «STRING» – unbeli
@Tom Hawtin - tackline: что не так с массивом? Мой ответ может быть неправильным, но ваш комментарий ничего не указывает. Дайте вниз, пока не появится лучшее объяснение. – Roman