2

我问这个问题只是出于好奇,我知道这样做很愚蠢。

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 仍在块中)?

4

2 回答 2

1

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

于 2012-10-31T11:30:24.563 回答
0

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

于 2012-10-31T12:22:28.783 回答