在 Java 中,一个 Object 本身可以作为一个锁来保护它自己的状态。此约定用于许多内置类,如 Vector 和其他同步集合,其中每个方法都是同步的,因此受到对象本身的内在锁的保护。这是好事还是坏事?也请给出理由。
问问题
308 次
2 回答
3
优点
- 这很简单。
- 您可以从外部控制锁。
缺点
- 它打破了封装。
- 你不能改变它的锁定行为而不改变它的隐含契约。
在大多数情况下,除非您正在开发一个将被广泛使用的 API,否则这并不重要。所以虽然使用synchronised(this)
不理想,但很简单。
于 2012-06-28T14:34:31.697 回答
1
嗯Vector
,Hashtable
等等在内部是这样同步的,我们都知道他们发生了什么......
老实说,我找不到像这样进行同步的任何充分理由。以下是我看到的缺点:
- 几乎总是有一种更有效的方法来确保线程安全,而不是仅仅锁定整个方法。
- 它会减慢单线程环境中的代码速度,因为您在实际上不需要锁的情况下支付了锁定和解锁的开销。
- 它给人一种错误的安全感,因为尽管每个操作都是同步的,但操作序列却不是同步的,而且您仍然可能不小心创建数据竞争。想象一个在每个方法上同步的集合和以下代码:
if(collection.isEmpty()) { collection.add(...); }
假设目标是只添加一个项目,上面的代码不是线程安全的,因为在if
检查和实际调用之间可能会中断一个线程add
,即使两个操作是单独同步的,所以实际上有可能得到两个集合中的项目。
于 2012-06-28T14:58:22.587 回答