這其中我試圖證明嵌套鎖問題的代碼,嘗試過使用嵌套鎖,但仍然面臨僵局
import java.util.concurrent.locks.*;
class SharedResource{
private static final Lock lock = new ReentrantLock();
private void methodThree(String name,int x) throws Exception{
lock.lock();
while(x <= 15){
System.out.println("METHOD-THREE/THREAD-NAME : "+name+" NUM-VAL "+x);
x++;
Thread.sleep(250);
}
}
private void methodTwo(String name,int x) throws Exception{
lock.lock();
while(x <= 10){
System.out.println("METHOD-TWO/THREAD-NAME : "+name+" NUM-VAL "+x);
x++;
Thread.sleep(250);
}
methodThree(name,x);
}
public void methodOne(String name,int x) throws Exception{
try{
lock.lock();
while(x <= 5){
System.out.println("METHOD-ONE/THREAD-NAME : "+name+" NUM-VAL "+x);
x++;
Thread.sleep(250);
}
methodTwo(name,x);
}finally{
lock.unlock();
}
}
}
class MyRequestREQ extends Thread{
private SharedResource res;
private int num = 1;
MyRequestREQ(SharedResource res,String name){
super(name);
this.res = res;
}
@Override
public void run(){
try{
res.methodOne(Thread.currentThread().getName(),num);
}catch(Exception e){
System.out.println(e);
}
}
}
public class LockCountPractise{
public static void main(String [] args){
SharedResource resource = new SharedResource();
MyRequestREQ[] requests = new MyRequestREQ[]{
new MyRequestREQ(resource,"JACK"),
new MyRequestREQ(resource,"JILL"),
new MyRequestREQ(resource,"JASON")
};
for(int x=0; x < requests.length;x++){
requests[x].start();
}
}
}
但我得到的是所有的一個運行的線程「JACK」的輸出,這個線程打印直到數15,然後掛斷。
上述程序是否面臨死鎖問題?
是否需要解鎖類SharedResource的所有方法中的鎖?
等待建議。
感謝您的答覆,我可以鎖定解鎖在第一方法本身,從方法2和3中除去所有的鎖,這是一個正確的方法? – 2012-02-08 07:37:45
正確的方法取決於你想要的。正如在我編輯答案1鎖定解鎖使得線程依次計數 – destan 2012-02-08 07:42:00
並且還注意到,當您使用1鎖定解鎖時,對於這種特定情況,在method1或method3中的解鎖將是相同的。 – destan 2012-02-08 07:43:09