синхронизированная блокировка класса и блокировка объекта

задняя часть Безопасность

предисловие

В обычной разработке мы будем думать об этом, когда будем иметь дело с одновременным доступом к объектам и переменным (для обеспечения потокобезопасности данных).synchronizedключевые слова. Конечно, в некоторых конкретных случаях возможны и другие варианты обеспечения синхронизации многопоточного доступа к ресурсам, такие как:ReentrantLock,ReentrantReadWriteLock.

Использование синхронизированного

Давайте сначала разберемся, что такое блокировки объектов и блокировки классов? Блокировки объекта используются в методах экземпляра объекта или в экземпляре объекта, а блокировки класса используются в статических методах класса или объекте класса класса.

  • sychronizedдобавить ключевые слова вstaticстатическим методом илиsynchonized(Class)Блок кода предназначен для блокировки класса Class
  • sychronizedДобавьте ключевые слова в не-staticСтатический метод заключается в блокировке объекта

Из определения двух приведенных выше пунктов может быть трудно понять, Ниже мы проверим это с помощью нескольких демонстраций.

public class Service {

    synchronized public static void methodA() {
        try {
            System.out.println("methodA start by " + Thread.currentThread().getName()+" at time " + System.currentTimeMillis());
            Thread.sleep(3000);
            System.out.println("methodA end by " + Thread.currentThread().getName()+" at time " + System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    synchronized public static void methodB() {
        try {
            System.out.println("methodB start by " + Thread.currentThread().getName() +" at time " + System.currentTimeMillis());
            Thread.sleep(3000);
            System.out.println("methodB end by " + Thread.currentThread().getName()+" at time " + System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    synchronized public  void methodC() {
        try {
            System.out.println("methodC start by " + Thread.currentThread().getName()+" at time " + System.currentTimeMillis());
            Thread.sleep(3000);
            System.out.println("methodC end by " + Thread.currentThread().getName()+" at time " + System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Тестовый экземпляр

Запуск результатов тестового экземпляра

Проанализируем беговые результаты:methodA methodCДва потока выполняются перекрестно (асинхронно), поэтому у нас такой вывод, что два потока вытесняют разные блокировки, один — блокировку класса (метод A), а другой — блокировку объекта (метод C). Более глубокое объяснение заключается в том, что блокировка класса и блокировка объекта — это две разные блокировки, которые контролируют разные области и не мешают друг другу. Точно так же, когда поток получает блокировку объекта, он также может получить этот тип блокировки, то есть получить две блокировки одновременно, что разрешено.

methodAиmethodBОба вытесняют одну и ту же блокировку класса, и результаты выполнения двух потоков соответствуют ожидаемому синхронному выполнению.

конец

Три человека, это должен быть мой учитель. В последнее время занимаюсь многопоточностью и высококонкурентной грамотностью.Пока делюсь с вами галантереей,надеюсь каждый поправит. Также добро пожаловать, чтобы обратить внимание на мои самородки или короткие книги, имя柴码