多线程
文章平均质量分 85
吖土豆
太阳再远,踮起脚尖也可以靠近阳光。
展开
-
Java多线程之volatile保证可见性原理
底层在给volatile变量赋值时,会发送一个lock指令,这个指令会锁住特定的内存地址,并将线程中该变量缓存行的数据立即写回主存,并触发总线嗅探机制。读取和修改都会经过总线,总线嗅探机制会嗅探总线上共享变量的改变,如果CPU发现自己线程中缓存的该共享变量被修改了,会将该缓存行置为无效状态,然后从主存中再次加载该共享变量的值。原创 2022-12-12 17:19:34 · 1041 阅读 · 3 评论 -
Java多线程之volatile
在Java多线程内存模型中,线程对某个主存中的变量进行修改时,对另一个也用到这个变量的线程来说是不可见的。但需要注意的是,volatile只能保证用到volatile变量代码前后的有序性,不保证再往后的代码(比如println之后的)。下面的代码,我们预想的结果应该是4000,但执行结果是无法预测的。对一个 volatile 变量的写操作 Happens-Before 于对这个 volatile 变量的读操作。解决办法:1. 加锁;交换执行顺序,是不会影响线程1的执行结果的,线程2也一样。原创 2022-12-12 14:17:37 · 405 阅读 · 0 评论 -
Java多线程之内存模型(JMM)
开始CPU是直接和主存进行交互的,但这样会有一个很大的问题,CPU的计算速度非常快,而主存是硬盘操作,比起CPU会慢很多很多,有时候CPU需要等待主存,导致效率很低。Java多线程内存模型是基于Cpu缓存模型建立的,它的作用是屏蔽掉不同硬件和操作系统的内存访问差异,实现各种平台具有一致的并发效果。线程从主内存中读取一个变量到自己的工作内存,线程结束时再把这个变量写回主内存中,是需要经过以下8个操作。这些操作需要按顺序执行,可以不连续执行,比如read和load之间可以夹杂其他操作。原创 2022-12-10 11:43:17 · 1217 阅读 · 0 评论 -
线程池中的线程是如何保活和回收的
线程池根据阻塞队列的阻塞原理进行线程保活。线程池根据阻塞队列的两种不同的阻塞方式进行回收。如果是非核心线程,如果阻塞时间到了,则退出消失。如果线程因异常情况要消失,会在线程池中补一个线程。原创 2022-11-29 13:57:51 · 2127 阅读 · 0 评论