[英]Java synchronized vs deadlock example
我對線程和並發編程不熟悉。 我正在尋找一個簡單的代碼片段,它會導致死鎖,這是:
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而不是sync來轉換此示例,但我不知道如何:為了獲得類似的東西,有趣的是需要具有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()
來lockX.lock()
dX
上同步塊中的每個入口,並通過調用lockX.unlock()`來替換dX
上同步塊中的所有出口。
使用tryLock()
達到目的,因為它返回而不是在無法獲取鎖的情況下等待。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.