假设您有两个可以访问同一公共对象的线程。一个线程有一个代码块来读取对象的字段。
synchronized(object)
{
read object fields
}
当读取对象字段代码在线程1中执行时,如果线程2想要更新对象的字段,则它必须等到线程1在更新之前完成对象的字段的读取(例如,是同步代码块执行时被其他线程访问锁定的对象吗?
答案 0 :(得分:1)
在对象上进行同步不会以任何方式“锁定”它。除非更新对象的字段以相同的方式同步,否则它可能与您在此处显示的阅读代码交错。
答案 1 :(得分:0)
不,第二个线程不会等待,除非它在同一个对象上也有synchronized
块。
synchronized(object)
{
// read object fields
}
... in other thread:
synchronized(object)
{
// write object fields
}
答案 2 :(得分:0)
同步块仅保护其中的代码。因此,如果两个或多个线程尝试在synchronized块内运行代码(受同一对象监视器保护),则它们将独占执行。这意味着如果一个线程已进入同步块,则其他线程必须等到它出来。
同步块无论如何都不会锁定对象,它只是使用对象的监视器来保护其中的代码。如果你想使对象线程的方法安全,那么你必须声明它们是同步的。
synchronized getField()
synchronized setField()
现在可以安全地通过多个线程调用getField()和setField()。
然而,使用synchronized会产生性能成本,您可以尝试使用Locks,或 java.util.concurrent.atomic 中的Atomic类,如AtomicInteger,AtomicBoolean或AtomicReference。