线程安全,但不能防止死锁?

时间:2016-10-24 13:41:17

标签: java multithreading class deadlock

我遇到了这一行,其中指出"但是,即使所有操作都是线程安全的,检索操作也不需要锁定,并且没有任何支持以阻止所有操作的方式锁定整个表访问"在Java类[ConcurrentHashMap](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html)的整体描述中。我的问题是:这是否意味着ConcurrentHasMap不会阻止死锁?另外我认为线程安全意味着不会发生死锁?

2 个答案:

答案 0 :(得分:5)

你得到的方法是错误的:每当你创建一个需要锁定的设计时,你就会打开的可能性以获得死锁。

这并不一定意味着任何此类架构本身都容易受到死锁的影响。

示例:典型的死锁情况是线程A锁定L1并等待锁定L2;而线程B保持L2并需要L1。如果您只有一个锁定对象,那么该场景就是一个......不可能发生。

换句话说:你没有使用X类,它会阻止死锁。这是不可能的。如果有的话,你可能正在使用X类,因为它为你提供的功能可以让你想出一个“保证死锁”的设计!

答案 1 :(得分:4)

只有在 两个不同的锁时,即当您持有锁并等待另一个锁释放时,才会发生死锁。 (然而,死锁的条件更多)。

当ConcurrentHashMap尝试在可能的情况下避免锁定时,您无法获取地图可能等待的地图上仅 操作的锁定。 因此,仅在地图上的操作不会导致死锁。

但是,线程安全并不意味着无死锁。它只保证代码在从多个线程调用时根据其接口甚至进行操作。 使类线程安全通常包括添加锁以保证安全执行。

您可能还想查看Wikipedia article