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

sleep() method behavior in synchronize block

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。谁能告诉我为什么?

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

如果您想看到不同之处,请将 tr 也传递给您的第二个线程。那么你有 2 个线程共享 1 个对象(和一个锁)。

您正在为 class 创建 两个 个实例。

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

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

synchronized 方法在 this 上隐式同步。在你的例子中 ThreadRunnable.

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

您有多种选择来解决您的问题,例如:

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