java併發編程--synchronized關鍵字

 

package cn.bufanli.test;

/**
 * 關鍵字 synchronized 關鍵字取得的鎖都是對象鎖,而不是一段代碼(方法) 當做鎖
 * 所以代碼中哪個線程synchronized關鍵字的方法 哪個線程就持有該方法所屬對象的鎖(lock)
 *多線程多個鎖:多個線程每個線程都可以拿到自己指定的鎖.分別獲得鎖之後,執行synchronized方法體的內    
 *容
 * 在靜態方法上加synchronized 關鍵字,表示鎖定.class類 類一級別的鎖(獨佔.class類)
 * 類級別的鎖:創建多個對象,多個對象持有的鎖是1把;
 * 方法級別鎖,創建多個對象,多個對象各持有1把鎖
 */
public class  MultiThread {
    /**
     * 變量上加static 關鍵字保證數據的原子性
     */
    private static int num = 0;

    /**
     * 方法上加 static 是類鎖
     * @param tag
     */
    private  synchronized  void printNum(String tag){
        try {
            if(tag.equals("a")){
                num = 100;
                System.out.println("tag a ,set num over!");
                Thread.sleep(1000);
            }else{
                num = 200;
                System.out.println("tag b ,set num over!");
            }
            System.out.println("tag:" + tag + "num:" + num);

        }catch (Exception e){

        }
    }

    /**
     * 注意主函數run方法的執行順序
     * @param args
     */
    public static void main(String[] args) {
        //兩個不同的對象
        MultiThread multiThread = new MultiThread();
        MultiThread multiThread2 = new MultiThread();


        Thread thread = new Thread(() -> {
            multiThread.printNum("a");
        });
        Thread thread2 = new Thread(() -> {
            multiThread2.printNum("b");
        });
        thread.start();
        thread2.start();
        /*Thread thread = new Thread(new Runnable() {
            @Override
            public void run(){
                multiThread.printNum("a");
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run(){
                multiThread2.printNum("b");
            }
        });
        thread.start();
        thread2.start();*/


    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章