Java同步类由两个线程组成

时间:2016-06-11 22:29:00

标签: java multithreading

我有两个线程,同一个类的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){
            …
        }
}

}

2 个答案:

答案 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将不是当前线程...因此您可能会锁定。然而,这不是一个理智的程序员会做的事情。