JUC学习笔记


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

一、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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值