JAVA並發編程學習筆記------鎖順序死結

來源:互聯網
上載者:User

標籤:rate   and   extends   tac   void   rgs   方案   rom   str   

一、需求描述:

  將資金從一個賬戶轉移到另一個賬戶。

二、程式實現:

(1)賬戶類:

public class Account {    private long account;    public Account(String user, long account) {        this.account = account;    }    public Account() {        super();    }    public long getAccount() {        return account;    }    public void setAccount(long account) {        this.account = account;    }    public void debit(long money){        this.account -= money;    }    public void credit(long money){        this.account += money;    }}

  (2)資產轉移類:

public class TransMoney {    private static final Object tieLock = new Object();    public static void transferMoney(Account fromAccount,Account toAccount,long amount){        synchronized (fromAccount){            synchronized (toAccount){                fromAccount.debit(amount);                toAccount.credit(amount);            }        }    }}

  (3)測試類別:

public class DemonstrateDeadLock {    private static final int NUM_THREADS = 20;    private static final int NUM_ACCOUNTS = 5;    private static final int NUM_ITERATIONS = 1000000;    public static void main(String[] args) {        final Random rdn = new Random();        final Account[] accounts = new Account[NUM_ACCOUNTS];        for(int i=0;i<accounts.length;i++){            accounts[i] = new Account();        }        class TransferThread extends Thread{            public void run(){                for(int i=0;i<NUM_ITERATIONS;i++){                    int fromAccount = rdn.nextInt(NUM_ACCOUNTS);                    int toAccount = rdn.nextInt(NUM_ACCOUNTS);                    TransMoney.transferMoney(accounts[fromAccount],accounts[toAccount],rdn.nextInt(1000));                }            }        }        for(int i=0;i<NUM_THREADS;i++){            new TransferThread().start();        }    }}

  (4)解析:

上述程式容易形成死結,原因在於多賬戶調用TransMoney.transferMoney時,存在鎖順序衝突,

解決方案是使用System.identityHashCode來定義鎖的順序,消除死結的可能性,代碼實現如下:

public static void transferMoney(final Account fromAccount,final Account toAccount,final long amount){    class Helper{        public void transfer(){            fromAccount.debit(amount);            toAccount.credit(amount);        }    }    int fromHash = System.identityHashCode(fromAccount);    int toHash = System.identityHashCode(toAccount);    if(fromHash < toHash){        synchronized (fromAccount){            synchronized (toAccount){                new Helper().transfer();            }        }    }else if(fromHash > toHash){        synchronized (toAccount){            synchronized (fromAccount){                new Helper().transfer();            }        }    }else{        synchronized (tieLock){            synchronized (fromAccount){                synchronized (toAccount){                    new Helper().transfer();                }            }        }    }}

 

JAVA並發編程學習筆記------鎖順序死結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.