java 並發synchronized使用

來源:互聯網
上載者:User

標籤:[]   method   pack   get   class   線程   max   div   row   

從版本1.0開始,java中每個對象都有一個內部鎖,如果一個方法用synchronized修飾,那麼對象的鎖將保護整個方法,也就是說要調用該方法,線程必須獲得內部的對象鎖

換句話說

public synchronized void method(){  method body}

等價於

public void method(){this.lock();try{method body;}finally{this.unlock}}

 

內部對象只有一個相關條件,wait方法添加一個線程到等待集中,notifyAll方法解除等待線程的阻塞狀態

package reentrant_lock;/** * Created by luozhitao on 2017/8/23. */public class bank_syn {    private double [] accounts;    public bank_syn(int n,double bance){        accounts=new double[n];        for(int i=0;i<n;i++){            accounts[i]=bance;        }    }//    public synchronized  void tansfer(int from,int to,double transf_num) throws InterruptedException{        while (accounts[from]<transf_num)            wait();        accounts[from]-=transf_num;        System.out.printf("轉出賬戶轉出%f 剩餘 %10.2f",transf_num,accounts[from]);        accounts[to]+=transf_num;        System.out.printf("轉入賬戶目前餘額為 %10.2f",accounts[to]);        notifyAll();        System.out.printf(" 目前所有賬戶總額為 %10.2f",get_total());    }    public synchronized double get_total(){        double sum=0;        for (double d:accounts){            sum+=d;        }        return sum;    }    //    public int size(){        return accounts.length;    }}

 

主線程

package reentrant_lock;/** * Created by luozhitao on 2017/8/18. */public class transferRunnable implements Runnable { //   private Bank bank;    private bank_syn bank;    private int fromAccount;    private double maxAccount;    private int DELAY=10;    int flag=0;    public transferRunnable(bank_syn b,int from,double max){        this.bank=b;        this.fromAccount=from;        this.maxAccount=max;    }    public void run() {        try{            while (true){                int toAccount=(int)((bank.size()-1)*Math.random());                System.out.println("toAccount ="+toAccount);                double account_m=maxAccount*Math.random();                System.out.println("account_m is "+account_m);                bank.tansfer(fromAccount,toAccount,account_m);                Thread.sleep((int) (DELAY * Math.random()));                flag++;            }        }catch (InterruptedException e){e.printStackTrace();}    }}

main

package reentrant_lock;/** * Created by luozhitao on 2017/8/23. */public class bank_testsyn {    private static int accoun_num=100;    private static double init_num=1000;    public static void main(String [] args){        bank_syn syn=new bank_syn(accoun_num,init_num);        for(int i=0;i<accoun_num;i++){            transferRunnable transferrun = new transferRunnable(syn,i,init_num);            Thread t=new Thread(transferrun);            t.start();        }    }}

 

java 並發synchronized使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.