статический метод с синхронизированным блоком внутри, блокирует весь класс в Java? - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть класс, который выполняет 3 потока, и в каждом потоке я спрашиваю и проверяю глобальные переменные. Я пытаюсь заблокировать каждую переменную отдельно, я не хочу блокировать весь класс каждый раз, когда я изменяю одну из переменных. Я немного исследовал, но я все еще путаюсь. В этом случае, поскольку я должен получить доступ к переменным из каждого потока, я должен сделать методы статичными, поэтому мои вопросы: я блокирую каждую переменную или весь класс каждый раз, когда вызываю методы получения и установки?

 public class MyClass {
    private static boolean bool1= false;
    private static boolean bool2= false;


    public static void main(String[] args) {

        //run Thread1
        //run Thread2
        //run thread3
    }


    private static Object lock1 = new Object();
    private static Object lock2 = new Object();

    public static boolean isBool1() {
        synchronized(lock1) {
            return bool1;
        }
    }

    public static void setBool1(boolean bool) {
        synchronized(lock1) {
            MyClass.bool1= bool1;
        }
    }


    public static boolean isBool2() {
        synchronized(lock2) {
            return bool2;
        }
    }

    public static void setBool2(boolean bool2) {
        synchronized(lock2) {
            MyClass.bool2= bool2;
        }
    }

}

1 Ответ

0 голосов
/ 11 сентября 2018

Нет, вы не блокируете класс, ваши статические методы не объявлены как синхронизированные, а также вы не блокируете экземпляр класса, потому что у вашего класса нет экземпляров.

Однако нет необходимостиобъявите ваши методы статическими, чтобы вызывать их из отдельных потоков.Ваш код будет работать так же, если вы не объявите ничего статического и вызовете методы для одного экземпляра.Это также был бы лучший подход, как правило, плохая идея объявлять что-то статичное, что не должно быть.Это затрудняет использование вашего кода в многопоточной или общей виртуальной машине (например, сервер приложений).

Кроме того, часто существуют более эффективные способы обеспечения безопасности потоков, чем свободное использование ключевого слова synchronized для отдельных объектов.Вы можете рассмотреть возможность использования BlockingQueue с ThreadPoolExecutor, настроенным для использования одного потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...