Java 同步块中的sleep()方法行为
由于采用同步方法,t2线程应该在t1之后打印SOP,但两个线程同时打印SOP。有人能告诉我为什么吗?没有相互排斥。这两个对象都有各自的独立监视器,它们在同步时获取这些监视器,因此它们都同时运行 如果您想看到不同,那么也将tr传递给第二个线程。然后有两个线程共享一个对象和一个锁。您正在创建两个类实例 synchronized可防止不同的方法并行调用同一方法上的方法 它不会阻止在不同对象上并行调用方法 一个同步的方法会隐式地在该服务器上同步。在您的例子中,是ThreadRunnable的实例 但是每个线程都有自己的实例,所以它们使用两个不同的监视器 您有几种解决问题的方法,例如: 使用私有静态最终对象锁=新对象;作为具有同步块的监视器。 或者更简单地说,螺纹t2=新螺纹TR;Java 同步块中的sleep()方法行为,java,sleep,synchronize,Java,Sleep,Synchronize,由于采用同步方法,t2线程应该在t1之后打印SOP,但两个线程同时打印SOP。有人能告诉我为什么吗?没有相互排斥。这两个对象都有各自的独立监视器,它们在同步时获取这些监视器,因此它们都同时运行 如果您想看到不同,那么也将tr传递给第二个线程。然后有两个线程共享一个对象和一个锁。您正在创建两个类实例 synchronized可防止不同的方法并行调用同一方法上的方法 它不会阻止在不同对象上并行调用方法 一个同步的方法会隐式地在该服务器上同步。在您的例子中,是ThreadRunnable的实例 但是每
“同时”吗?无论如何,线程的执行顺序没有保证。提示:您希望我们花时间来解决您的问题。因此,在发布问题之前,请使用预览窗口检查输入的缩进。作为记录,这一点经常被遗忘:不要忘记在某个时候接受其中一个答案。
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();
}
}