同步块中的sleep()方法行为

时间:2017-10-18 11:08:10

标签: java sleep synchronize

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线程应在t1之后打印SOP,但两个线程同时打印SOP。谁能告诉我为什么?

3 个答案:

答案 0 :(得分:3)

您正在创建班级的两个实例。

synchronized可以防止不同的方法并行调用相同的方法上的方法。

它不会阻止在不同的对象上并行调用方法!

答案 1 :(得分:3)

synchronized方法隐式在this上同步。在您的情况下,ThreadRunnable

的实例

但每个线程都有自己的实例,因此它们使用两个不同的监视器。

您有多种方法可以解决您的问题,例如:

  • 使用private static final Object lock = new Object();作为具有同步块的监视器。
  • 或更简单地Thread t2 = new Thread(tr);

答案 2 :(得分:1)

没有相互排斥。这两个对象都有自己独立的监视器,它们在synchronized处获取,因此它们都在同一时间运行。

如果您想看到差异,请将tr传递给您的第二个帖子。然后你有2个线程共享1个对象(和一个锁)。