我有两个线程,同一个类的t1和t2; t1在类本身上同步,而t2在this
(实例)上同步。
假设t1进入同步块,t2仍然在同步块中时t2可以进入吗?
编辑: 例如:
public class MyThread extends Thread{
private int id;
public MyThread(int i){id=I;}
public void run(){
if(id==1)//t1 will lock the clas
synchronize(MyThread.class){
…
}
else if(id==2) //t2 will lock the instance
synchronize(this){
…
}
}
}
答案 0 :(得分:2)
是的,第二个线程可以进入其同步块,而第一个线程仍处于同步块中。那是因为两个线程正在同步不同的东西 - 类的第一个线程,该类的实例上的第二个线程。
答案 1 :(得分:1)
在您的示例中,
使用id
1
创建的所有MyThread实例都将在MyThread
类对象上同步。这意味着没有两个MyThread
实例可以"在"第一个synchonized
块同时出现。
使用MyThread
id
创建的所有2
个实例将在this
上同步。现在this
是线程对象本身 1 。由于每个线程都有不同的MyThread
,这意味着实际上没有锁定。
id
值为1
的实例的run方法不会阻止id
值为2
的实例,反之亦然。他们使用不同的锁。
1 - 理论上,如果一个线程可以访问另一个线程的MyThread
对象,它可以在该对象上显式调用run()
方法。毕竟,方法是public
。在这种情况下,this
将不是当前线程...因此您可能会锁定。然而,这不是一个理智的程序员会做的事情。