你知道java中的synchronized block 是否保证是原子的吗?
想象一下下面的情况
线程_1,2:
synchronized(object){object.modify();}
(对象是共享变量。)
假设 thread_M 会改变对对象的引用
synchronized(object){object = new Object()}
现在假设线程 1 和 2 正在竞争获取对象的锁
是否有可能发生以下情况:
1. Thread1: 读取旧对象
2. ThreadM: 修改对象引用并释放旧对象锁
3.线程2:读取新对象;检查锁;锁定它
4. Thread1:检查锁(ok cos old object was read);锁定它
现在两个线程都有锁并修改相同的(新)对象
因此,具体说明我的问题 - 是否可以在某处保证同步(对象)步骤(1 和 4)是原子的(如步骤 3 中所述)?
最佳答案
假设你有一些变量,foo
:
Foo foo;
假设它持有一个对象的引用:
foo = new Foo(...);
假设我们有一个synchronized
block :
synchronized(foo) {
...
}
synchronized
关键字不对变量foo
进行操作,并且不对同步块(synchronized block)中的语句。
synchronized
关键字在这里做的唯一一件事是防止其他线程同时在同一实例 上进行同步。
如果在线程 A 位于 block 内时重新分配变量 foo
以引用某个不同的实例,那么其他线程 B 将能够同时进入同一 block ,因为每个两个线程中的一个将在不同的实例上同步。
关于java - 进入同步块(synchronized block)是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29217266/