JUC學習筆記

2020-08-12 23:47:36


在这里插入图片描述
在这里插入图片描述

一、volatile關鍵字-記憶體可見性

在这里插入图片描述

二、CAS演算法

在这里插入图片描述

三、ConcurrentHashMap鎖分段機制 機製

在这里插入图片描述
在这里插入图片描述

四、CountDownLatch閉鎖

在这里插入图片描述
在这里插入图片描述

五、Callable介面

在这里插入图片描述
與Runntable相似,只多了返回值,並且拋出了異常。

六、Lock同步鎖

在这里插入图片描述

生產者消費者案例:

  • 問題一:當滿倉或缺貨時,生產者或消費者沒停下來。
    解決:使用等待喚醒機制 機製,當生產者進貨成功,this.notifyAll()喚醒其他執行緒,當滿倉時,this.wait()進入等待,當消費者消費成功,this.notifyAll()喚醒其他執行緒,當缺貨時,this.wait()進入等待。
  • 問題二:虛假喚醒
    解決辦法:使用while代替if判斷,當被喚醒後while回圈再次判斷後,通過了再執行操作。

七、Condition控制執行緒通訊

在这里插入图片描述

八、執行緒按序交替

在这里插入图片描述

public class TestABCAlternate {

    public static void main(String[] args) {
        ABCAlternate abc = new ABCAlternate();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    abc.loopA(i);
                }
            }
        }, "A").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    abc.loopB(i);
                }
            }
        }, "B").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    abc.loopC(i);
                }
                System.out.println("-----------------");
            }
        }, "C").start();
    }

}

class ABCAlternate{
    private static int number = 1;  //標記,執行A,B,C

    Lock lock = new ReentrantLock();
    Condition condition1 = lock.newCondition();
    Condition condition2 = lock.newCondition();
    Condition condition3 = lock.newCondition();

    public void loopA(int totalLoop){
        lock.lock();    //加鎖
        try {
            if(number != 1){
                condition1.await();
            }

            for (int i = 0; i < 2; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + totalLoop + "\t" + i);
            }

            number = 2;
            condition2.signal();    //喚醒下一個

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();  //釋放鎖
        }

    }


    public void loopB(int totalLoop){
        lock.lock();    //加鎖
        try {
            if(number != 2){
                condition2.await();
            }

            for (int i = 0; i < 3; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + totalLoop + "\t" + i);
            }

            number = 3;
            condition3.signal();    //喚醒下一個

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();  //釋放鎖
        }

    }



    public void loopC(int totalLoop){
        lock.lock();    //加鎖
        try {
            if(number != 3){
                condition3.await();
            }

            for (int i = 0; i < 4; i++) {
                System.out.println(Thread.currentThread().getName() + "\t" + totalLoop + "\t" + i);
            }

            number = 1;
            condition1.signal();    //喚醒下一個

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();  //釋放鎖
        }

    }

}

九、ReadWriteLock 讀寫鎖

在这里插入图片描述

十、執行緒八鎖

在这里插入图片描述

十一、執行緒池

在这里插入图片描述

十二、ForkJoinPool 分支/合併框架 工作竊取

在这里插入图片描述
在这里插入图片描述

學習視訊:https://www.bilibili.com/video/BV14W411u7gB?p=1