volatile
两个特性 1.可见性 2.禁止指令重排
volatile保证不了原子性,原子性需要加锁。
package org.example.c3; /*** * 可见性 * * // 对一个变量解锁之前,必须先把此变量同步回主存中。这样解锁后,线程就可以访问到被修改后的值。 // 所以Synchronized锁住的对象,其值具有可见性。 */ public class C1_VisibilityTest { static volatile Boolean always = true; public static void main(String[] args) throws InterruptedException { // 线程1 new Thread(() -> { // while (always) { // System.out.println("执行..."); // synchronized (always) { // // } } }).start(); Thread.sleep(2000); // 线程2 always = false; } }
这⾥很直观的感受到volatile的效果:被volatile修饰的变量能够保证每个线程能够获取该变量的最新值。 当flag加了volatile关键字修饰时,线程2修改完flag的值之后线程1能感受到flag变量被修改了,为什么会这样⼦呢?下⾯结合JMM原⼦性操作对实现机制进⾏深⼊讲解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!