Java 线程安全题目

开发者 2024-9-20 13:05:44 17 0 来自 中国
1. 线程安全题目分为多个层面


  • 可见性 volatile, Synchronized
  • 有序性 volatile, Synchronized
  • 原子性 AtomicInteger, Lock, Synchronized
2. 可见性

分析下面代码的运行效果:
public class Demo {    static boolean flag = true;    public static void main(String[] args) throws InterruptedException {        Thread thread = new Thread(() -> {            while (flag) {}        });        thread.start();        TimeUnit.SECONDS.sleep(1);        flag = false;    }}线程并不会制止,进入死循环
缘故起因是读取的是【工作内存】中的缓存,并不会去访问【主存】中的数据
main 线程修改了主存中的数据,对其他线程(thread-0)不可见
改进1: 让线程停息 1s, 此时可以读取最新值
while (flag) {  try {      TimeUnit.SECONDS.sleep(1);  } catch (InterruptedException e) {  }}改进2:static volatile boolean flag = true;
volatile 可办理可见性题目,可让一个线程对共享变量的修改,能够实时的被其他线程看到
2.1 关于可见性与原子性

volatile 只能包管看到最新值,不能办理指令交错
synchronized 即可以包管代码块的原子性,同时也包管代码块内变量的可见性;但 synchronized 属于重量级操作,性能相对更低
3. 有序性

JVM 在不影响准确性的条件下,可以调整语句的实行次序,这种叫【指令重排】
多线程情况下指令重排会影响准确性
指令重排序优化,条件是不能影响效果
分阶段,分工是提拔服从的关键
3.1 克制指令重排

volatile
4. 原子性

i++ 实在是 3 条指令
4. 对象发布和初始化时的安全题目

4.1 处理惩罚逸出


  • 返回“副本”
  • 工厂模式
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 22:35, Processed in 0.180401 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表