Synchronized static methods. Java.

На вебинаре рассказали, что при вызове синхронизированого статического метода будет заблокирован весь класс, ибо используется его монитор. Примера не показали! А зря...... На деле это оказалось не так!
Вот доказательства - https://imgur.com/fR7WJSt
Код для тестов...
public class Main {
public static void main(String[] args) {
new Thread(() -> Man.sync()).start();
new Thread(() -> Man.notSync()).start();
new Thread(() -> Man.notSync()).start();
new Thread(() -> Man.notSync()).start();
new Thread(() -> Man.sync()).start();
new Thread(() -> Man.sync()).start();
new Thread(() -> Man.notSync()).start();
new Thread(() -> Man.notSync()).start();
new Thread(() -> Man.notSync()).start();
}
}
class Man {
private static int counter;
public static void notSync() {
System.out.println("notSync! " + ++counter);
}
public static synchronized void sync() {
System.out.println("sync! " + ++counter);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Сначала в отдельном потоке вызываем статический синхронизированный метод, внутри которого "усыпляем" поток на 10 секунд. Затем в других потоках вызываем другой статический НЕсинхронизированный метод этого же класса. В результате видим, что несинхронизированный метод не дожидается отработки синхонизированного! То есть класс не блокируется полностью!
Получается весьма потоко-НЕбезопасно! Но учили обратному! Так где правда?
29 января 2019 в 12:32