Поведение метода sleep() в блоке синхронизации

class ThreadRunnable implements Runnable{
  synchronized public void run(){       
    System.out.println("In Runnable implemented class");

    try {
        Thread.sleep(60000);
        System.out.println("sleeping over");
        System.out.println(System.currentTimeMillis());
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
  }
}

public class Sample {
    public static void main(String [] args){
        ThreadRunnable tr = new ThreadRunnable();

        Thread t1 = new Thread(tr);

        Thread t2 = new Thread(new ThreadRunnable());

        t1.start();
        t2.start();
    }
}

Как и в методе синхронизации, поток t2 должен печатать SOP после t1, но оба потока печатают SOP одновременно. Кто-нибудь может сказать мне, почему?

3 ответа

Решение

synchronized метод неявно синхронизируется по this, В вашем случае экземпляр ThreadRunnable,

Но у каждого потока есть свой экземпляр, поэтому они используют два разных монитора.

У вас есть несколько вариантов решения вашей проблемы, например:

  • использовать private static final Object lock = new Object(); как монитор с синхронизированным блоком.
  • или проще Thread t2 = new Thread(tr);

Вы создаете два экземпляра вашего класса.

synchronized предотвращает параллельное обращение разных методов к одному и тому же методу.

Это не препятствует параллельному вызову методов для разных объектов!

Там нет взаимного исключения. Оба объекта имеют свои собственные отдельные мониторы, которые они получают в synchronizedтак что они оба бегут одновременно.

Если вы хотите увидеть разницу, пройдите tr к вашей второй теме, а также. Тогда у вас есть 2 потока, совместно использующих 1 объект (и один замок).

Другие вопросы по тегам