给出以下代码
class Test{
double x;
public void synchronized a()
{
x = 0;
//do some more stuff
}
public void b()
{
x = -1;
}
}
a() 中的线程是否可以在修改 x 的过程中被调用同一对象上的 b() 的线程抢占?
同步方法不是像一个原子操作一样执行吗?
我相信另一种方法是可能的(b() 中的线程可以被在同一对象上调用 a() 的线程抢占,因为 b() 没有保护我的测试对象锁)。
有人可以阐明这一点吗?
最佳答案
synchronized
仅阻止其他线程获取同一监视器。它绝不会使操作成为原子操作。特别是:
- 该方法的副作用可以被其他未尝试在同一监视器上同步的线程观察到
- 如果发生异常,则不会回滚
- 如果其他线程未在同一监视器上同步,则它们可以访问和修改同步方法使用的相同数据
b()
不是同步的,因此完全有可能一个线程正在执行 a()
而另一个正在执行 b()
同时。
关于java - 抢占正在执行同步方法的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6123580/