[TOC]
<br/>
> ### volatile
* 在 JDK1.2 之前,Java的內存模型實現總是從主存(即共享內存)讀取變量,是不需要進行特別的注意的。而在當前的 Java 內存模型下,線程可以把變量保存本地內存(比如機器的寄存器)中,而不是直接在主存中進行讀寫。這就可能造成一個線程在主存中修改了一個變量的值,而另外一個線程還繼續使用它在寄存器中的變量值的拷貝,造成數據的不一致。
* `volatile`關鍵字只能修飾變量。
* `volatile`關鍵字的可見性,volatile 修飾的成員變量在每次被線程訪問時,都強迫從主存(共享內存)中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程將變化值回寫到主存(共享內存),并通知其他線程對該變量的緩存失效。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值,這樣也就保證了同步數據的可見性。
> ### `volatile`適用場景
* 對變量的寫入操作不依賴其當前值,如`i++`
* 該變量沒有包含在具有其他變量的不變式中
> ### 底層原理
* `volatile`變量修飾的共享變量進行寫操作的時候在匯編層會對該命令添加`Lock`前綴,該指令在多核處理器下會引發兩件事情
* 將當前處理器緩存行的數據寫回到系統內存
* 這個寫回內存的操作會使在其他CPU里緩存了該內存地址的數據無效
> ### 緩存一致性協議`MESI`
* `Modified`被修改,`Exclusive`獨享的,`Shared`共享的,`Invalid`無效的
- asD
- Java
- Java基礎
- Java編譯器
- 反射
- collection
- IO
- JDK
- HashMap
- ConcurrentHashMap
- LinkedHashMap
- TreeMap
- 阻塞隊列
- java語法
- String.format()
- JVM
- JVM內存、對象、類
- JVM GC
- JVM監控
- 多線程
- 基礎概念
- volatile
- synchronized
- wait_notify
- join
- lock
- ThreadLocal
- AQS
- 線程池
- Spring
- IOC
- 特性介紹
- getBean()
- creatBean()
- createBeanInstance()
- populateBean()
- AOP
- 基本概念
- Spring處理請求的過程
- 注解
- 微服務
- 服務注冊與發現
- etcd
- zk
- 大數據
- Java_spark
- 基礎知識
- Thrift
- hdfs
- 計算機網絡
- OSI七層模型
- HTTP
- SSL
- 數據庫
- Redis
- mysql
- mybatis
- sql
- 容器
- docker
- k8s
- nginx
- tomcat
- 數據結構/算法
- 排序算法
- 快排
- 插入排序
- 歸并排序
- 堆排序
- 計算時間復雜度
- leetcode
- LRU緩存
- B/B+ 樹
- 跳躍表
- 設計模式
- 單例模式
- 裝飾者模式
- 工廠模式
- 運維
- git
- 前端
- thymeleaf
- 其他
- 代碼規范
- work_project
- Interview