个人觉得JUC里面的东西比JVM还要玄,JUC中将引领我们用一种多线程的角度思考整体的程序,可以说是一种挑战吧。
volatile,中文语义:不稳定的
大家都应该了解这个常识吧!(不知道的一定要记好)
Java中,若一个变量会被多个线程所使用,我们需要给这个变量加上volatile关键字。
しかし!(但是)作为未来大厂高级电脑的附属品,我们必然不能只了解这个规则,更应该洞悉why,才能在未来的使用中,稳定起飞
一、首先,volatile到底是个啥?
Java语言规范第3版中对volatile的定义如下:
Java编程语言允许线程访问共享变量,为了 确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。
Java语言 提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存 模型确保所有线程看到这个变量的值是一致的
简单来讲:
volatile做到了两点:(下面这两句出自大佬的总结,学完以后感觉确实是这两句)
- 保证目标在Java内存空间的可见性(这句话先记起来,后面会细锁)
- 禁止指令重排
看下面的demo,若我们去掉volatile关键字,则consumer永远都不能执行完成,若我们加上了volatile,则执行成功了。
各位不要在循环等待中使用print方法,print方法是一个加锁的方法,该操作会刷新缓存,
见https://blog.csdn.net/weixin_44494373/article/details/111767803
public class VolatileTest {
//线程池,用来执行任务
ExecutorService executorService ;
int a;
volatile boolean flag=false;
public VolatileTest() {
executorService = new ThreadPoolExecutor(3, 3,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>