Возьмём вот такой код(Заметим что класс 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. Что КОНКРЕТНО происходит? Заранее, спасибо!