同步对象:锁定代码与锁定对象

时间:2016-01-01 21:51:42

标签: java multithreading synchronized

假设您有两个可以访问同一公共对象的线程。一个线程有一个代码块来读取对象的字段。

synchronized(object)
{
    read object fields
}

当读取对象字段代码在线程1中执行时,如果线程2想要更新对象的字段,则它必须等到线程1在更新之前完成对象的字段的读取(例如,是同步代码块执行时被其他线程访问锁定的对象吗?

3 个答案:

答案 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。