簡(jiǎn)單了解java volatile關(guān)鍵字實(shí)現(xiàn)的原理
一、volatile關(guān)鍵字的語(yǔ)義分析
1.保證可見性
對(duì)共享變量的修改,其他線程能夠馬上感知到。但不能保證原子性(i++)
2.保證有序性
3.volatile的原理和實(shí)現(xiàn)機(jī)制
有volatile修飾的共享變量進(jìn)行寫操作的時(shí)候會(huì)多出有 “l(fā)ock”標(biāo)志的匯編代碼,Lock前綴的指令在多核處理器下會(huì)引發(fā)兩件事情:
1)將當(dāng)前處理器緩存行中的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存中
2)這個(gè)寫回內(nèi)存的操作會(huì)使在其他cpu里緩存了該內(nèi)存地址的數(shù)據(jù)無(wú)效。
二、volatile的使用場(chǎng)景
1.狀態(tài)標(biāo)志(開關(guān)模式)
package com.roy.http; public class ShutDownDemmo extends Thread{ private volatile boolean state = false; @Override public void run() { while(state){ System.out.println("我在做工作"); } } public void shutDown(){ state = false; } }
當(dāng)調(diào)用shutDown方法時(shí),里面只有一個(gè)賦值操作,所以它是原子性的,同時(shí)state字段是volatile的,所以當(dāng)值發(fā)生變化時(shí)其它線程會(huì)立即察覺到。
2.雙重檢查鎖定(double-checked-locking)
package com.roy.http; public class Singleton { private volatile static Singleton instance; public static Singleton getInstance(){ if (instance==null) { synchronized (Singleton.class) { instance = new Singleton(); } } return instance; } }
單例模式中使用雙重檢查鎖定。
三、volatile和synchronized的區(qū)別
1.使用上的區(qū)別
volatile只能修飾變量,而synchronized只能修飾方法和語(yǔ)句塊。
2.對(duì)原子性的保證
volatile不能保證原子性,synchronized保證了原子性。
3.對(duì)可見性的保證
兩者都能保證可見性,但實(shí)現(xiàn)原理不同
volatile對(duì)變量添加了lock,synchronized使用monitorenter和monitorexit。
4.對(duì)有序性的保證
volatile能保證有序,synchronized也能保證有序,但是代價(jià)大
5.其他
synchronized會(huì)引起阻塞,volatile不會(huì)引起阻塞。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java并發(fā)編程volatile關(guān)鍵字的作用
- Java多線程并發(fā)編程 Volatile關(guān)鍵字
- Java并發(fā)編程:volatile關(guān)鍵字詳細(xì)解析
- 詳細(xì)分析java并發(fā)之volatile關(guān)鍵字
- 深入了解Java中Volatile關(guān)鍵字
- Java Volatile關(guān)鍵字同步機(jī)制詳解
- Java Volatile關(guān)鍵字實(shí)現(xiàn)原理過程解析
- 一文精通Java中的volatile關(guān)鍵字
- Java面試官最喜歡問的關(guān)鍵字之volatile詳解
- Java中的關(guān)鍵字volatile詳解
- 詳解Java面試官最愛問的volatile關(guān)鍵字
- Java中Volatile關(guān)鍵字詳解及代碼示例
- Java并發(fā)編程——volatile關(guān)鍵字
相關(guān)文章
Java小項(xiàng)目之迷宮游戲的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Java小項(xiàng)目之迷宮的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01當(dāng)mybatis返回值遇見內(nèi)部類的問題
這篇文章主要介紹了當(dāng)mybatis返回值遇見內(nèi)部類的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Java實(shí)現(xiàn)PDF轉(zhuǎn)為線性PDF詳解
線性化PDF文件是PDF文件的一種特殊格式,可以通過Internet更快地進(jìn)行查看。本文將通過后端Java程序?qū)崿F(xiàn)將PDF文件轉(zhuǎn)為線性化PDF。感興趣的可以了解一下2021-12-12為什么Spring官方推薦的@Transational還能導(dǎo)致生產(chǎn)事故
在Spring中進(jìn)行事務(wù)管理非常簡(jiǎn)單,只需要在方法上加上注解@Transactional,那么為什么Spring官方推薦的@Transational還能導(dǎo)致生產(chǎn)事故,本文就詳細(xì)的介紹一下2021-11-11Android中PreferenceFragment的使用詳解
本文主要介紹了Android中PreferenceFragment的使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09