JAVA學習55-執行緒同步及JUC安全集合擴充知識

七顆糖很甜發表於2020-09-27

執行緒同步

由於我們通常通過private關鍵字來保證資料物件只能被方法訪問,所以我們爭對方法提出了一套機制,就是synchronized關鍵字。
synchronized方法控制物件的訪問,每個物件對應一個鎖。
1.同步方法
public synchronized void method(int args){}
2.同步塊
synchronized(鎖的物件){}//鎖的物件就是變化的量,需要增加,刪除,修改的物件
缺點:若將一個大的方法宣告為synchronized將會影響效率。
//不安全的案例
//執行緒不安全,出現了負數,因為沒有同步執行緒,讓他們排隊買票
public class UnsafeBuyTicket {
    public static void main(String[] args) {
        //設定執行緒同步
        /*Thread thread=new Thread();
        thread.setDaemon(true);
        thread.start();
        */
        BuyTicket station = new BuyTicket();
        new Thread(station,"苦逼的我").start();
        new Thread(station,"牛逼的你們").start();
        new Thread(station,"可惡的黃牛黨").start();
    }
}


//買票的執行緒
class BuyTicket implements Runnable {
    //票
    private int ticketNum = 10;
    boolean flag = true;//外部停止方式

    @Override
    public void run() {
        while (true) {
            try {
                buy();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //買票的方法
    //加入同步方法synchronized
    //synchronized 同步的是本身,要同步別的方法,就要用到synchronized同步塊
    //鎖的物件就是變化的量,需要增加,刪除,修改的物件
    private synchronized void buy() throws InterruptedException {
        //判斷是否有票
        if (ticketNum <= 0) {
            return;
        }
        Thread.sleep(100);
        System.out.println(Thread.currentThread().getName() + "買到了第" + ticketNum-- + "張票");
    }
}

JUC安全集合擴充知識

import java.util.concurrent.CopyOnWriteArrayList;
//CopyOnWriteArrayList在concurrent包裡面
//測試JUC安全型別的集合
//這個類本來是安全的
public class TestJUC {
    public static void main(String[] args) {
        //CopyOnWriteArrayList這個類本來是安全的
        CopyOnWriteArrayList<String> list=new CopyOnWriteArrayList<String>();
        for (int i = 0; i < 1000; i++) {
            new Thread(()->{
                list.add(Thread.currentThread().getName());
            }).start();
        }
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(list.size());
    }
}

相關文章