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

Java 同步块中的sleep()方法行为,java,sleep,synchronize,Java,Sleep,Synchronize,由于采用同步方法,t2线程应该在t1之后打印SOP,但两个线程同时打印SOP。有人能告诉我为什么吗?没有相互排斥。这两个对象都有各自的独立监视器,它们在同步时获取这些监视器,因此它们都同时运行 如果您想看到不同,那么也将tr传递给第二个线程。然后有两个线程共享一个对象和一个锁。您正在创建两个类实例 synchronized可防止不同的方法并行调用同一方法上的方法 它不会阻止在不同对象上并行调用方法 一个同步的方法会隐式地在该服务器上同步。在您的例子中,是ThreadRunnable的实例 但是每

由于采用同步方法,t2线程应该在t1之后打印SOP,但两个线程同时打印SOP。有人能告诉我为什么吗?

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

如果您想看到不同,那么也将tr传递给第二个线程。然后有两个线程共享一个对象和一个锁。

您正在创建两个类实例

synchronized可防止不同的方法并行调用同一方法上的方法

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

一个同步的方法会隐式地在该服务器上同步。在您的例子中,是ThreadRunnable的实例

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

您有几种解决问题的方法,例如:

使用私有静态最终对象锁=新对象;作为具有同步块的监视器。 或者更简单地说,螺纹t2=新螺纹TR;
“同时”吗?无论如何,线程的执行顺序没有保证。提示:您希望我们花时间来解决您的问题。因此,在发布问题之前,请使用预览窗口检查输入的缩进。作为记录,这一点经常被遗忘:不要忘记在某个时候接受其中一个答案。
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();
    }
}