多线程小结

原子性 - 保证指令不会受到线程上下文切换的影响

可见性(共享变量可见性):保证指令不会受 cpu 缓存的影响

可见性 - 问题:一个线程对主内存的修改,对于另一个线程不可见。

可见性 - 解决:volatile(易变关键字),避免线程从工作缓存获取变量,必须从主存中获取变量的值,线程操作 volatile 变量都是直接操作主存。(保证共享变量可见性)

 

指令重排:JVM 会在不影响正确性的前提下,可以调整语句的执行顺序
指令重排 - 解决:volatile 修饰的变量,可以禁用指令重排

volatile原理
1. 如何保证可见性
写屏障:保证在该写屏障之前对共享变量的改动都会同步到主存
读屏障:保证在该屏障之后的对共享变量的读取,都是加载的主存中的最新数据

2. 如何保证有序性
写屏障:保障在写屏障之前的代码不会重排序到写屏障之后。
读屏障:保障在读屏障之后的代码不会重排序到读屏障之前。

线程池:(从内存占用和上下文切换角度考虑)
创建线程池的好处:最大化发挥已有线程的作用。
               1. 减少线程的数量,减少内存的占用
               2. 避免出现频繁的线程上下文切换
               
拒绝策略:把权力下放到调用者,实现代码不直接写死,提高了拓展性。
        把具体的操作抽象成接口,具体的实现由调用者把参数传递进来。
        // 1. 死等
        // queue.put(task);
         // 2) 带超时等待
        // queue.offer(task, 1500, TimeUnit.MILLISECONDS);
         // 3) 让调用者放弃任务执行
        // log.debug("放弃{}", task);
         // 4) 让调用者抛出异常
        // throw new RuntimeException("任务执行失败 " + task);
         // 5) 让调用者自己执行任务

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值