0

在 Java 中,一个 Object 本身可以作为一个锁来保护它自己的状态。此约定用于许多内置类,如 Vector 和其他同步集合,其中每个方法都是同步的,因此受到对象本身的内在锁的保护。这是好事还是坏事?也请给出理由。

4

2 回答 2

3

优点

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

缺点

  • 它打破了封装。
  • 你不能改变它的锁定行为而不改变它的隐含契约。

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

于 2012-06-28T14:34:31.697 回答
1

VectorHashtable等等在内部是这样同步的,我们都知道他们发生了什么......

老实说,我找不到像这样进行同步的任何充分理由。以下是我看到的缺点:

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

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

于 2012-06-28T14:58:22.587 回答