предисловие
В обычной разработке мы будем думать об этом, когда будем иметь дело с одновременным доступом к объектам и переменным (для обеспечения потокобезопасности данных).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
Оба вытесняют одну и ту же блокировку класса, и результаты выполнения двух потоков соответствуют ожидаемому синхронному выполнению.
конец
Три человека, это должен быть мой учитель. В последнее время занимаюсь многопоточностью и высококонкурентной грамотностью.Пока делюсь с вами галантереей,надеюсь каждый поправит. Также добро пожаловать, чтобы обратить внимание на мои самородки или короткие книги, имя柴码