线程安全但不能防止死锁?
Thread safe but does not prevent deadlock?
我遇到了这条线,它指出 "However, even though all operations are thread-safe, retrieval operations do not entail locking, and there is not any support for locking the entire table in a way that prevents all access" 在 Java class [ConcurrentHashMap] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html) 的整体描述中。我的问题是:这是否意味着 ConcurrentHasMap 不能防止死锁?另外我认为线程安全意味着不会发生死锁?
你误会了:每当你创建一个需要锁定的设计时,你就打开了死锁的可能性。
这并不一定意味着任何此类架构本身都容易出现死锁。
例子:典型的死锁情况是线程A有锁L1等待锁L2;而线程 B 持有 L2 并需要 L1。如果你只有一个个锁对象,那么这种情况就是一个..不可能发生的。
换句话说:您没有使用 class X 它会 防止 死锁。这是不可能的。如果有的话,您可能正在使用 class X,因为它为您提供了允许您提出 "guaranteed-dead-lock-free" 设计的功能!
只有当 有 两个不同的锁时才会发生死锁,即当您持有一个锁并等待另一个锁释放时。 (但是,死锁的条件更多)。
由于 ConcurrentHashMap 试图在可能的情况下避免 锁,因此您无法在地图上通过 only 操作获取锁地图可以等待。
因此,只在地图上操作不会导致死锁。
但是,线程安全并不意味着无死锁。它只保证代码将根据其接口运行,even 从多个线程调用时。
使 class 线程安全通常包括 添加 锁以保证安全执行。
您可能还想看看 Wikipedia article。
我遇到了这条线,它指出 "However, even though all operations are thread-safe, retrieval operations do not entail locking, and there is not any support for locking the entire table in a way that prevents all access" 在 Java class [ConcurrentHashMap] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html) 的整体描述中。我的问题是:这是否意味着 ConcurrentHasMap 不能防止死锁?另外我认为线程安全意味着不会发生死锁?
你误会了:每当你创建一个需要锁定的设计时,你就打开了死锁的可能性。
这并不一定意味着任何此类架构本身都容易出现死锁。
例子:典型的死锁情况是线程A有锁L1等待锁L2;而线程 B 持有 L2 并需要 L1。如果你只有一个个锁对象,那么这种情况就是一个..不可能发生的。
换句话说:您没有使用 class X 它会 防止 死锁。这是不可能的。如果有的话,您可能正在使用 class X,因为它为您提供了允许您提出 "guaranteed-dead-lock-free" 设计的功能!
只有当 有 两个不同的锁时才会发生死锁,即当您持有一个锁并等待另一个锁释放时。 (但是,死锁的条件更多)。
由于 ConcurrentHashMap 试图在可能的情况下避免 锁,因此您无法在地图上通过 only 操作获取锁地图可以等待。 因此,只在地图上操作不会导致死锁。
但是,线程安全并不意味着无死锁。它只保证代码将根据其接口运行,even 从多个线程调用时。 使 class 线程安全通常包括 添加 锁以保证安全执行。
您可能还想看看 Wikipedia article。