线程进入同步块后我们可以更改锁定吗?

时间:2012-10-31 10:14:29

标签: java multithreading

我问这个问题只是为了好奇,我知道这样做是愚蠢的。

public void doSomething() 
{
      synchronized(object_A){
        count++;
        average = count/total;
      }
}

现在让我说我有2个并发运行的线程(调用函数doSomething()),而第一个线程已经进入块,让我们说“count ++”行,第二个线程被阻塞并等待锁定。

现在我尝试object_A = new LockObject()(在另一个帖子中)。现在线程1和线程2发生了什么?

线程2会进入阻止吗?既然它已经执行了语句“synchronized(object_A)”,那么更改锁是否为时已晚?

线程1是否会在同步块中更改锁定(假设线程1仍然在块中)?

2 个答案:

答案 0 :(得分:1)

就像ignis说的那样,但线程2将在线程1完成后看到新引用,因为它必须刷新所有变量。

答案 1 :(得分:0)

唯一的问题是数据完整性。线程将在不同的锁上进行同步,受锁保护的数据将具有错误的值。锁在实例初始值设定项中创建为私有final字段或类的构造函数。