我不熟悉线程和并发编程。我正在寻找一个会导致死锁的简单片段,这里是:
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而不是synchronized来改变这个例子,但是我不知道如何:有趣的是需要有一个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();}
}
}
}
}
};
还是我完全错过了什么?
答案 0 :(得分:1)
使用ReentrantLocks转换示例确实意味着使用两个锁:一个与d1
相关联,另一个与d2
相关联。
您可以通过调用dX
替换lockX.lock()
上同步块中的每个入口,并通过调用lockX.unlock替换dX
上同步块的任何退出( )`。
使用tryLock()
会失败,因为如果无法获取锁定,它会返回而不是等待。