优秀的网站建设开发案例,无锡百度,怎么用织梦做网站后台,哔哩哔哩网站怎么做视频JMM
请你谈谈对Volatile的理解
Volatile是jvm提供的轻量级的同步机制#xff08;和synchronized差不多#xff0c;但是没有synchronized那么强大#xff09;
保证可见性不保证原子性禁止指令重排
什么是JMM
JMM#xff1a;java内存模型#xff0c;不存在的东西#…JMM
请你谈谈对Volatile的理解
Volatile是jvm提供的轻量级的同步机制和synchronized差不多但是没有synchronized那么强大
保证可见性不保证原子性禁止指令重排
什么是JMM
JMMjava内存模型不存在的东西概念约定
JMM即为JAVA 内存模型java memory model。因为在不同的硬件生产商和不同的操作系统下内存的访问逻辑有一定的差异结果就是当你的代码在某个系统环境下运行良好并且线程安全但是换了个系统就出现各种问题。Java内存模型就是为了屏蔽系统和硬件的差异让一套代码在不同平台下能到达相同的访问结果。JMM从java 5开始的JSR-133发布后已经成熟和完善起来。
关于JMM的一些同步的约定
线程解锁前必须把共享变量立刻刷回主存。 主内存中有一个共享变量假设线程a要操作主内存中的共享变量它不会直接操作主内存中的共享变量而是会拷贝一份到线程a的工作内存中如果线程a修改了自己线程内存中的共享变量那么在解锁前需要把更新的共享变量的值赋值给主内存中的共享变量。线程加锁前必须主存中的最新值到工作内存中。加锁和解锁是同一把锁。
线程、工作内存、主内存 从主存中read变量load到线程的工作内存中变量就被加载到了线程的工作内存中 执行引擎Use变量并assign返回。 将工作内存中的变量write并store到主内存中。 lock和unlock 意思就是线程a执行的慢变量还没有及时刷新到主存中线程b就已经更改变量并刷新到了主存中此时线程a依旧拿着旧的变量这就出现了问题。
内存交互操作有8种虚拟机实现必须保证每一个操作都是原子的不可在分的对于double和long类型的变量来说load、store、read和write操作在某些平台上允许例外
lock 锁定作用于主内存的变量把一个变量标识为线程独占状态unlock 解锁作用于主内存的变量它把一个处于锁定状态的变量释放出来释放后的变量才可以被其他线程锁定read 读取作用于主内存变量它把一个变量的值从主内存传输到线程的工作内存中以便随后的load动作使用load 载入作用于工作内存的变量它把read操作从主存中变量放入工作内存中use 使用作用于工作内存中的变量它把工作内存中的变量传输给执行引擎每当虚拟机遇到一个需要使用到变量的值就会使用到这个指令assign 赋值作用于工作内存中的变量它把一个从执行引擎中接受到的值放入工作内存的变量副本中store 存储作用于主内存中的变量它把一个从工作内存中一个变量的值传送到主内存中以便后续的write使用write 写入作用于主内存中的变量它把store操作从工作内存中得到的变量的值放入主内存的变量中
JMM对这八种指令的使用制定了如下规则 不允许read和load、store和write操作之一单独出现。即使用了read必须load使用了store必须write 不允许线程丢弃他最近的assign操作即工作变量的数据改变了之后必须告知主存 不允许一个线程将没有assign的数据从工作内存同步回主内存 一个新的变量必须在主内存中诞生不允许工作内存直接使用一个未被初始化的变量。就是对变量实施use、store操作之前必须经过assign和load操作 一个变量同一时间只有一个线程能对其进行lock。多次lock后必须执行相同次数的unlock才能解锁 如果对一个变量进行lock操作会清空所有工作内存中此变量的值在执行引擎使用这个变量前必须重新load或assign操作初始化变量的值 如果一个变量没有被lock就不能对其进行unlock操作。也不能unlock一个被其他线程锁住的变量 对一个变量进行unlock操作之前必须把此变量同步回主内存
部分内容转载自 https://www.cnblogs.com/null-qige/p/9481900.html
华为员工中患忧郁症、焦虑症的不断增多令人十分担心。有什么办法可以让员工积极、开放、正派地面对人生我思考再三不得其解。
任正非要快乐地度过充满困难的一生