我问这个问题只是为了好奇,我知道这样做是愚蠢的。
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仍然在块中)?
答案 0 :(得分:1)
就像ignis说的那样,但线程2将在线程1完成后看到新引用,因为它必须刷新所有变量。
答案 1 :(得分:0)
唯一的问题是数据完整性。线程将在不同的锁上进行同步,受锁保护的数据将具有错误的值。锁在实例初始值设定项中创建为私有final字段或类的构造函数。