原子性 - 保证指令不会受到线程上下文切换的影响
可见性(共享变量可见性):保证指令不会受 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) 让调用者自己执行任务
3万+

被折叠的 条评论
为什么被折叠?



