Возьмём вот такой код(Заметим что класс Counter не вложенный, а просто в одном пакете, но не в отдельном файле .java):
public class Solution {
public static void main(String[] args) throws InterruptedException {
Counter counter1 = new Counter();
Counter counter2 = new Counter();
Counter counter3 = new Counter();
counter1.start();
counter2.start();
counter3.start();
}
}
class Counter extends Thread {
@Override
public void run() {
synchronized (Counter.class) {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
System.out.println();
}
}
}
Опираясь на ЭТУ лекцию это значит, как я понял, следующее:
Сколько бы не было создано объектов класса Counter, только один поток одновременно сможет выполнить его метод run(). Окей, этот код работает и, действительно, нити по очереди выполняют код.
Далее, если в данном коде написать synchronized (this), то нити начнут выполняться все сразу, т.к. объектов Counter у нас 3 и мьютекс this не подойдёт. А подойдёт он в случае, если мы создадим один объект класса Counter, и запихнём его в конструктор трём объектам класса Thread(new Thread(Runnable r));
Тогда класс Solution будет выглядеть так:
public class Solution {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
Thread thread1 = new Thread(counter);
Thread thread2 = new Thread(counter);
Thread thread3 = new Thread(counter);
thread1.start();
thread2.start();
thread3.start();
}
}
И НАКОНЕЦ ВОПРОС: Почему, если написать synchronized (Solution.class), то всё будет работать и нити будут выполняться одна за другой? (И неважно как выглядит наш Solution: как в первом варианте или как во втором)? Блокируется мьютекс у всех объектов Solution? Так мы не создаём объектов Solution. Что КОНКРЕТНО происходит? Заранее, спасибо!