Java线程安全状态的示例分析


这篇文章主要为大家展示了“Java线程安全状态的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java线程安全状态的示例分析”这篇文章吧。线程的状态是一个枚举类型 Thread.StateNEW: 安排了工作, 还未开始行动RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.就绪状态BLOCKED: 这几个都表示排队等着其他事情WAITING: 这几个都表示排队等着其他事情TIMED_WAITING: 这几个都表示排队等着其他事情TERMINATED: 工作完成了.NEW:Thread对象有了,但是PCB还没有RUNNABLE:线程正在CPU上执行或者即将到CPU上执行(PCB在就绪队列中,随时可能被调度到)WAITING:wait方法导致TIMED_WAITING:sleep方法导致BLOCKED:等待锁导致TERMINATED:对象还在,但PCB已经没了线程不安全的原因①线程是抢占式执行的线程不安全的万恶之源,线程之间的调度完全由内核负责,用户代码中感知不到,也无法控制。线程之间谁先执行,谁后执行,谁执行到哪里从CPU上下来,这样的过程用户无法控制也无法感知到的。②自增免费云主机域名操作不是原子的每次++都能拆成三个步骤 把内存中的数据读取到CPU中 把CPU中的数据+1 把计算的数据写回内存中如果两个线程串行执行,此时计算结果为2。如果两个线程并行执行,线程1进行++操作到一半的时候,线程也进行了++操作,此时自增两次,但结果为1。必须保证线程1save结束了,线程2再load,此时计算结果才正确③多个线程尝试修改同一个变量如果是一个线程修改一个变量,线程安全如果多个线程读取同一个变量,线程安全如果多个线程修改不同的变量。线程安全④内存可见性导致线程安全问题⑤指令重排序Java的编译器在编译代码时,会对指令进行优化,调整指令的先后顺序,保证原有的逻辑不变的情况下,提高程序的运行效率锁-synchronized未加锁已加锁此处的synchronized就是针对counter这个对象来加锁,进入increase方法内部,就把加锁状态设为ture,increase方法退出之后,就把加锁状态设为false,如果某个线程已经把加锁状态设为ture,此处的其他的线程尝试去加锁,就会阻塞synchronized的特性——刷新内存synchronized 的工作过程:1. 获得互斥锁2. 从主内存拷贝变量的最新副本到工作的内存3. 执行代码4. 将更改后的共享变量的值刷新到主内存5. 释放互斥锁synchronized的特性——互斥一旦线程一获取到锁,并且没有释放的话,线程2就会一直在锁这里阻塞等待不是同一把锁,就不回出现竞争,就没有互斥了。这个代码中,两个线程都在针对locker1和locker2的类对象进行竞争,此处的locker1和locker2的类型都是Object,对应的对象都是相同的对象。以上是“Java线程安全状态的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注百云主机行业资讯频道!

相关推荐: ​CJS​,​UMD​,​ESM和​IIFE怎么用

这篇文章主要讲解了“CJS,UMD,ESM和IIFE怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CJS,UMD,ESM和IIFE怎么用”吧!CJS,UMD,ESM,IIFE是JavaScript用来实现…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 09/25 21:11
下一篇 09/25 21:11

相关推荐