Java 线程安全但不防止死锁?

Java 线程安全但不防止死锁?,java,multithreading,class,deadlock,Java,Multithreading,Class,Deadlock,在Java类[ConcurrentHashMap]()的总体描述中,我遇到了这一行,它指出“尽管所有操作都是线程安全的,但检索操作并不需要锁定,并且不支持以阻止所有访问的方式锁定整个表”。我的问题是:这是否意味着ConcurrentHasMap不能防止死锁?另外,我认为线程安全意味着不会发生死锁?你的理解是错误的:每当你创建一个需要锁定的设计时,你就打开了死锁的可能性 这并不一定意味着任何这样的体系结构本身都容易受到死锁的攻击 示例:典型的死锁情况是线程a拥有锁L1并等待锁L2;而线程B持有L2

在Java类[ConcurrentHashMap]()的总体描述中,我遇到了这一行,它指出“尽管所有操作都是线程安全的,但检索操作并不需要锁定,并且不支持以阻止所有访问的方式锁定整个表”。我的问题是:这是否意味着ConcurrentHasMap不能防止死锁?另外,我认为线程安全意味着不会发生死锁?

你的理解是错误的:每当你创建一个需要锁定的设计时,你就打开了死锁的可能性

这并不一定意味着任何这样的体系结构本身都容易受到死锁的攻击

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


换句话说:您没有使用类X,它将防止死锁。这是不可能的。如果有的话,您可能正在使用X类,因为它为您提供了允许您提出“保证无死锁”设计的功能

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

由于ConcurrentHashMap试图尽可能避免锁定,因此您无法通过仅对映射可能等待的映射执行的操作来获取锁定。 因此,仅在映射上的操作不会导致死锁


然而,线程安全并不意味着无死锁。它只保证代码将根据其接口运行,即使是从多个线程调用时也是如此。 使类线程安全通常包括添加锁以保证安全执行


您可能还想看看ConcurrentHashMap上的。

操作不会导致死锁,如果可能导致死锁,希望没有人会将代码标记为线程安全的。感谢您的快速反馈并接受@不,没那么容易。在Java 8中,
ConcurrentHashMap
提供了
compute…
方法,允许在锁定特定密钥(或存储桶)时更新映射,这意味着提供的函数在求值期间不得尝试更新另一个映射(或尝试获取任何其他锁)。正确使用
ConcurrentHashMap
将永远不会导致死锁,但错误使用时出现死锁的可能性并不意味着
ConcurrentHashMap
不是线程安全的……有趣的帖子:回答也不错;实际上和我的没什么不同。让我们为此感到荣幸。