gpt4 book ai didi

Java 同步与死锁示例

转载 作者:太空宇宙 更新时间:2023-11-04 07:39:05 24 4
gpt4 key购买 nike

我对线程和并发编程不熟悉。我正在寻找一个会导致死锁的简单片段,这里是:

public class TestLock {
private static class fun {
int a,b;

void read() {System.out.println(a+b);}
void write(int a,int b) {this.a=a;this.b=b;}
}

public static void main (String[] args) throws java.lang.Exception {
final fun d1=new fun();
final fun d2=new fun();

Thread t1=new Thread() {
public void run() {
for(int i=0;i<5;i++) {
synchronized(d2) {
d2.read();
try {
Thread.sleep(50);
} catch (Exception ex) {
ex.printStackTrace();
}
synchronized(d1) {
d1.write(i, i);
}
}
}
};

Thread t2=new Thread() {
public void run() {
for(int i=0;i<5;i++) {
synchronized(d1) {
d1.read();
try {
Thread.sleep(50);
} catch (Exception ex) {
ex.printStackTrace();
}
synchronized(d2) {
d2.write(i, i);
}
}
}
}
};
t1.start();
t2.start();
}
}

现在我想知道如何使用 ReentrantLock 而不是同步来转换这个示例,但我不明白如何:fun 是否需要具有 ReentrantLock 属性才能具有类似的内容

Thread t1=new Thread() {  
public void run() {
for(int i=0;i<5;i++) {
if(d2.lock.tryLock()) {
try {d1.read();Thread.sleep(50);} catch(Exception e) {e.printStackTrace();} finally {d1.lock.unlock();}
if(d2.lock.tryLock()) {
try {d2.write(i, i);} catch(Exception e) {e.printStackTrace();} finally {d2.lock.unlock();}
}
}
}
}
};

还是我完全错过了一些东西?

最佳答案

使用 ReentrantLocks 转换示例实际上意味着使用两个锁:一个与 d1 关联,另一个与 d2 关联。

您可以通过调用 lockX.lock() 替换 dX 上同步块(synchronized block)中的每个入口,并通过调用 lockX.unlock()` 替换 dX 上同步块(synchronized block)的任何退出。

使用 tryLock() 达不到目的,因为如果无法获取锁,它会返回而不是等待。

关于Java 同步与死锁示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16338458/

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