使用内部锁(好的或坏的)内置到Java中的同步决策

时间:2012-06-28 14:21:12

标签: java multithreading asynchronous synchronization thread-safety

在Java中,对象本身可以充当锁定以保护自己的状态。此约定用于许多内置类,如Vector和其他同步集合,其中每个方法都是同步的,因此由对象本身的内部锁保护。这是好事还是坏事?请说明原因。

2 个答案:

答案 0 :(得分:3)

赞成

  • 很简单。
  • 您可以从外部控制锁定。

缺点

  • 它打破了包围。
  • 如果不更改其隐含合约,则无法更改其锁定行为。

在大多数情况下,除非您正在开发将被广泛使用的API,否则无关紧要。因此,虽然使用synchronised(this)并不理想,但这很简单。

答案 1 :(得分:1)

VectorHashtable等在内部同步,我们都知道发生了什么......

老实说,我找不到像这样做同步的好理由。以下是我看到的缺点:

  1. 几乎总是有一种更有效的方法来确保线程安全,而不仅仅是锁定整个方法。
  2. 它会降低单线程环境中的代码速度,因为您需要支付锁定和解锁的开销,而无需实际需要锁定。
  3. 它给出了一种错误的安全感,因为虽然每个操作都是同步的,但操作序列却没有,你仍然可能会意外地创建数据竞争。想象一下在每个方法和以下代码上同步的集合:
  4. if(collection.isEmpty()) {
        collection.add(...);
    }
    

    假设目标是只添加一个项目,上面的代码不是线程安全的,因为线程可以在if检查和实际调用add之间中断,即使两者都是操作是单独同步的,因此可以在集合中实际获得两个项目。