gpt4 book ai didi

java - SharedArray 死锁和引发条件

转载 作者:行者123 更新时间:2023-12-02 05:25:14 24 4
gpt4 key购买 nike

我正在尝试使用可重入锁来模拟共享数组中的死锁场景。

class SharedArray { 
private int ff[];
private Lock keys[];

public SharedArray(int n){
ff = new int[n];
keys = new ReentrantLock[n];
for(int j = 0; j < n; j++){
ff[j] = (int)(Math.random()*100);
keys[j] = new ReentrantLock();
}
}

void swap(int j, int k) {
keys[j].lock(); keys[k].lock();
int t = ff[j]; ff[j] = ff[k]; ff[k] = t;
keys[j].unlock(); keys[k].unlock();
}
}

这里的交换方法很容易出现死锁,我已经实现了。例如,如果线程 1 是 swap(7,4),同时线程 2 是 swap(4,7),这将引发死锁。

如何防止死锁。需要什么样的重构。我尝试过使用同步,但我正在寻找可能可靠的方法来解决这个问题。

synchronized void swap(int j, int k) { 
keys[j].lock(); keys[k].lock();
int t = ff[j]; ff[j] = ff[k]; ff[k] = t;
keys[j].unlock(); keys[k].unlock();
}

最佳答案

How do I prevent it from deadlock?

防止死锁的一种方法是确保任何获取相同两个锁的线程始终以相同的顺序获取它们。

void swap(int j, int k) {
int first = Math.min(j, k);
int second = Math.max(j, k);
keys[first].lock(); keys[second].lock();
int t = ff[j]; ff[j] = ff[k]; ff[k] = t;
keys[second].unlock(); keys[first].unlock();
}

关于java - SharedArray 死锁和引发条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56237133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com