同步死锁

Blu*_*ond -1 java multithreading synchronization deadlock

如何在第8或第16行发生死锁?

 1. public class DeadlockRisk {
 2.   private static class Resource {
 3.     public int value;
 4.   }
 5.   private Resource resourceA = new Resource();
 6.   private Resource resourceB = new Resource();
 7.   public int read() {
 8.     synchronized(resourceA) { 
 9.       synchronized(resourceB) {
10.         return resourceB.value + resourceA.value;
11.       }
12.     }
13.   }
14
15.   public void write(int a, int b) {
16.     synchronized(resourceB) { 
17.       synchronized(resourceA) {
18.         resourceA.value = a;
19.         resourceB.value = b;
20.       }
21.     }
22.   }
23. }
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 5

可能会发生死锁,因为锁定顺序不一致,这意味着一个线程可以获取resourceA并等待resourceB另一个线程已经获取resourceB但正在等待resourceA.例如:

  • T1呼叫read(),成功获取resourceA,然后暂停.
  • T2呼叫write(),成功获取resourceB并等待resourceA.
  • T1恢复正在等待resourceB(永远不会释放T2).

无论是T1T2可能发展,因为每个资源上的其他已锁定等待.始终拥有一致的锁定顺序:

public int read() {
    synchronized(resourceA) { 
        synchronized(resourceB) {

public void write() {
    synchronized(resourceA) { 
        synchronized(resourceB) {
Run Code Online (Sandbox Code Playgroud)

(但是,在发布的代码中,似乎没有理由拥有多个锁,因为总是获取两个锁.)