Synchronized в данном случае (Java)

117
25 января 2022, 11:40
package StopAndResume;
public class NewThread implements Runnable {
    String name;
    Thread t;
    boolean flag;
    NewThread(String name)
    {
        this.name = name;
        t = new Thread(this, name);
        System.out.println("New Thread "  + t);
        flag = false;
        t.start();
    }
    @Override
    public void run() {
        try{
            for(int i = 15; i > 0; i--)
            {
                System.out.println(name + ": " + i);
                Thread.sleep(5000);
                synchronized (this) // ЗАЧЕМ ЭТО НУЖНО В ДАННОМ СЛУЧАЕ?
                {
                    while(flag)
                    {
                        wait();
                    }
                }
            }
        }catch (InterruptedException e)
        {
            System.out.println("Interrupted !");
        }
        System.out.println("Finish!!!!!");
    }
    synchronized void mysuspend()
    {
        flag = true;
    }
    synchronized void myresume()
    {
        flag = false;
        notify();
    }
}

        class Demo{
            public static void main(String[] args) {
                NewThread obj1 = new NewThread("F_I_R_S_T");
                NewThread obj2 = new NewThread("S_E_C_O_N_D");
                try{
                    Thread.sleep(10000);
                    obj1.mysuspend();
                    System.out.println(obj1.name + " is suspended!");
                    Thread.sleep(10000);
                    obj1.myresume();
                    System.out.println(obj1.name + " is resumed!");
                    obj2.mysuspend();
                    System.out.println(obj2.name + " is suspended!");
                    Thread.sleep(10000);
                    obj2.myresume();
                    System.out.println(obj2.name + " is resumed!");
                }catch (InterruptedException e){
                    System.out.println("Interrupted!");
                }
                try{
                    obj1.t.join();
                    obj2.t.join();
                }catch (InterruptedException e){
                    System.out.println("Interrupted!");
                }

            }
        }

Помогите пожалуйста разобраться , зачем нам нужна эта синхронизация в данном случае ? Как я ожидал , когда obj1 входит в этот метод и вызывает ожидание , то он должен блокировать вход obj2 так как он находиться в этом мониторе до тех пор пока не пробудится. Но obj2 не блокируется. Так вот ПОЧЕМУ obj2 не блокируется? И зачем нужна была эта синхронизация?

READ ALSO
Swing окно типа Подождите

Swing окно типа Подождите

Подскажите пожалуйста, есть ли в библиотеке Swing специальное окно состояния процесса типа Подождите идёт загрузка, которое само бы закрывалось...

148
ОШИБКА: столбец user0_.id не существует [дубликат]

ОШИБКА: столбец user0_.id не существует [дубликат]

Добавляю обработку исключения на случай перехода по url с неправильным id юзераТест срабатывает отлично, ошибка перехватывается и выбрасывается...

206
Зациклить последовательную анимацию блоков

Зациклить последовательную анимацию блоков

Как сделать последовательную анимацию, чтобы после пятого блока опять повторялся первый блокКаждый блок это отдельный div c классом

113
C++, член-тип шаблона

C++, член-тип шаблона

Рассмотрим следующий код:

121