簡體   English   中英

Java同步與死鎖示例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM