JUC学习笔记

文章目录

  • 一、volatile关键字-内存可见性
  • 二、CAS算法
  • 三、ConcurrentHashMap锁分段机制
  • 四、CountDownLatch闭锁
  • 五、Callable接口
  • 六、Lock同步锁
  • 七、Condition控制线程通信
  • 八、线程按序交替
  • 九、ReadWriteLock 读写锁
  • 十、线程八锁
  • 十一、线程池
  • 十二、ForkJoinPool 分支/合并框架 工作窃取

JUC学习笔记_第1张图片
JUC学习笔记_第2张图片

一、volatile关键字-内存可见性

JUC学习笔记_第3张图片

二、CAS算法

JUC学习笔记_第4张图片

三、ConcurrentHashMap锁分段机制

JUC学习笔记_第5张图片
在这里插入图片描述

四、CountDownLatch闭锁

JUC学习笔记_第6张图片
在这里插入图片描述

五、Callable接口

在这里插入图片描述
与Runntable相似,只多了返回值,并且抛出了异常。

六、Lock同步锁

JUC学习笔记_第7张图片

生产者消费者案例:

  • 问题一:当满仓或缺货时,生产者或消费者没停下来。
    解决:使用等待唤醒机制,当生产者进货成功,this.notifyAll()唤醒其他线程,当满仓时,this.wait()进入等待,当消费者消费成功,this.notifyAll()唤醒其他线程,当缺货时,this.wait()进入等待。
  • 问题二:虚假唤醒
    解决办法:使用while代替if判断,当被唤醒后while循环再次判断后,通过了再执行操作。

七、Condition控制线程通信

JUC学习笔记_第8张图片

八、线程按序交替

JUC学习笔记_第9张图片

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 读写锁

JUC学习笔记_第10张图片

十、线程八锁

JUC学习笔记_第11张图片

十一、线程池

JUC学习笔记_第12张图片

十二、ForkJoinPool 分支/合并框架 工作窃取

JUC学习笔记_第13张图片
JUC学习笔记_第14张图片

学习视频:https://www.bilibili.com/video/BV14W411u7gB?p=1

你可能感兴趣的:(Java,java)