繁体   English   中英

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

[英]Can we change the lock after thread enter synchronized block?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM