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