同步块中的 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);
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);