国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

面試突擊:為什么單例一定要加 Volatile?

開發 前端
懶漢模式指的是對象的創建是懶加載的方式,并不是在程序啟動時就創建對象,而是第一次被真正使用時才創建對象。

作者 | 磊哥

來源 | Java面試真題解析(ID:aimianshi666)

轉載請聯系授權(微信ID:GG_Stone)

單例模式的實現方法有很多種,如餓漢模式、懶漢模式、靜態內部類和枚舉等,當面試官問到“為什么單例模式一定要加 volatile?”時,那么他指的是為什么懶漢模式中的私有變量要加 volatile?

懶漢模式指的是對象的創建是懶加載的方式,并不是在程序啟動時就創建對象,而是第一次被真正使用時才創建對象。

要解釋為什么要加 volatile?我們先來看懶漢模式的具體實現代碼:

public class Singleton {
// 1.防止外部直接 new 對象破壞單例模式
private Singleton() {}
// 2.通過私有變量保存單例對象【添加了 volatile 修飾】
private static volatile Singleton instance = null;
// 3.提供公共獲取單例對象的方法
public static Singleton getInstance() {
if (instance == null) { //1 次效驗
synchronized (Singleton.class) {
if (instance == null) { //2 次效驗
instance = new Singleton();
}
}
}
return instance;
}
}

從上述代碼可以看出,為了保證線程安全和高性能,代碼中使用了兩次 if 和 synchronized 來保證程序的執行。那既然已經有 synchronized 來保證線程安全了,為什么還要給變量加 volatile 呢?在解釋這個問題之前,我們先要搞懂一個前置知識:volatile 有什么用呢?

一、volatile 作用

volatile 有兩個主要的作用,第一,解決內存可見性問題,第二,防止指令重排序。

1、 內存可見性問題

所謂內存可見性問題,指的是多個線程同時操作一個變量,其中某個線程修改了變量的值之后,其他線程感知不到變量的修改,這就是內存可見性問題。而使用 volatile 就可以解決內存可見性問題,比如以下代碼,當沒有添加 volatile 時,它的實現如下:

private static boolean flag = false;
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// 如果 flag 變量為 true 就終止執行
while (!flag) {

}
System.out.println("終止執行");
}
});
t1.start();
// 1s 之后將 flag 變量的值修改為 true
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("設置 flag 變量的值為 true!");
flag = true;
}
});
t2.start();
}

以上程序的執行結果如下:

然而,以上程序執行了 N 久之后,依然沒有結束執行,這說明線程 2 在修改了 flag 變量之后,線程 1 根本沒有感知到變量的修改。那么接下來,我們嘗試給 flag 加上 volatile,實現代碼如下:

public class volatileTest {
private static volatile boolean flag = false;
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// 如果 flag 變量為 true 就終止執行
while (!flag) {

}
System.out.println("終止執行");
}
});
t1.start();
// 1s 之后將 flag 變量的值修改為 true
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("設置 flag 變量的值為 true!");
flag = true;
}
});
t2.start();
}
}

以上程序的執行結果如下: 從上述執行結果我們可以看出,使用 volatile 之后就可以解決程序中的內存可見性問題了。

2、防止指令重排序

指令重排序是指在程序執行過程中,編譯器或 JVM 常常會對指令進行重新排序,已提高程序的執行性能。指令重排序的設計初衷確實很好,在單線程中也能發揮很棒的作用,然而在多線程中,使用指令重排序就可能會導致線程安全問題了。

所謂線程安全問題是指程序的執行結果,和我們的預期不相符。比如我們預期的正確結果是 0,但程序的執行結果卻是 1,那么這就是線程安全問題。

而使用 volatile 可以禁止指令重排序,從而保證程序在多線程運行時能夠正確執行。

二、為什么要用 volatile?

回到主題,我們在單例模式中使用 volatile,主要是使用 volatile 可以禁止指令重排序,從而保證程序的正常運行。這里可能會有讀者提出疑問,不是已經使用了 synchronized 來保證線程安全嗎?那為什么還要再加 volatile 呢?看下面的代碼:

public class Singleton {
private Singleton() {}
// 使用 volatile 禁止指令重排序
private static volatile Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) { //
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton(); //
}
}
}
return instance;
}
}

注意觀察上述代碼,我標記了第 ① 處和第 ② 處的兩行代碼。給私有變量加 volatile 主要是為了防止第 ② 處執行時,也就是“instance = new Singleton()”執行時的指令重排序的,這行代碼看似只是一個創建對象的過程,然而它的實際執行卻分為以下 3 步:

  1. 創建內存空間。
  2. 在內存空間中初始化對象 Singleton。
  3. 將內存地址賦值給 instance 對象(執行了此步驟,instance 就不等于 null 了)。

試想一下,如果不加 volatile,那么線程 1 在執行到上述代碼的第 ② 處時就可能會執行指令重排序,將原本是 1、2、3 的執行順序,重排為 1、3、2。但是特殊情況下,線程 1 在執行完第 3 步之后,如果來了線程 2 執行到上述代碼的第 ① 處,判斷 instance 對象已經不為 null,但此時線程 1 還未將對象實例化完,那么線程 2 將會得到一個被實例化“一半”的對象,從而導致程序執行出錯,這就是為什么要給私有變量添加 volatile 的原因了。

總結

使用 volatile 可以解決內存可見性問題和防止指令重排序,我們在單例模式中使用 volatile 主要是使用 volatile 的后一個特性(防止指令重排序),從而避免多線程執行的情況下,因為指令重排序而導致某些線程得到一個未被完全實例化的對象,從而導致程序執行出錯的情況。

責任編輯:姜華 來源: Java面試真題解析
相關推薦

2022-03-21 07:40:08

線程池Executors方式

2022-05-05 07:38:32

volatilJava并發

2019-01-29 11:02:30

消息中間件Java互聯網

2022-05-23 07:35:15

單例模式懶漢模式靜態內部類

2021-03-05 11:02:14

iOS 14.5蘋果更新

2020-12-23 13:29:15

微服務架構面試官

2021-12-03 06:59:23

HashCodeEquals面試

2021-12-13 09:10:48

equalshashCodeJava

2011-05-10 15:51:34

SEO

2022-04-24 09:54:24

ProxyReflect前端

2019-02-14 09:35:15

面試MQ中間件

2018-08-24 09:02:26

2022-01-10 13:06:13

微服務API網關

2022-07-27 07:36:01

TCP可靠性

2024-02-22 14:22:17

數字化轉型企業架構

2024-11-13 00:58:28

2024-10-10 05:00:00

2017-08-17 11:11:41

深度學習弱智能機器學習

2018-07-02 08:57:27

碼農業務程序員
點贊
收藏

51CTO技術棧公眾號

国产精品偷伦免费视频观看的| 国产91免费视频| 亚洲大胆精品| 日韩国产精品久久久| 中文国产成人精品久久一| 日韩二区三区| 国产欧美日韩三区| 色大师av一区二区三区| 欧美一区2区| 另类视频在线观看| 国产高清在线a视频大全| 亚洲一区二区三区视频在线| 一本色道久久88亚洲精品综合| 999成人精品视频线3| 久久艹在线视频| 高端美女服务在线视频播放| 色女孩综合影院| mm1313亚洲国产精品无码试看| 久久动漫亚洲| 91免费的视频在线播放| 成人av综合网| 最近2019免费中文字幕视频三| 羞羞电影在线观看www| 狠狠色狠狠色综合日日五| 男操女免费网站| 国产99一区视频免费| 精品一区久久久久久| 图片小说视频色综合| 午夜精品一区二区三区在线 | 国产国产一区| 亚洲国产欧美久久| 免费观看成人高潮| 欧美性猛交xxxx乱大交极品| va中文字幕| 国产精品免费av| 成人在线免费播放视频| 成人av在线观| 少妇av一区二区三区无码| 国产激情偷乱视频一区二区三区| 翔田千里亚洲一二三区| 日韩精品电影在线| 日韩亚洲视频| 麻豆精品精品国产自在97香蕉| 蜜桃视频日韩| 99在线观看免费视频精品观看| 99一区二区| 亚洲国产高清一区| 久久精品aaaaaa毛片| 视频一区中文字幕| 在线日韩av永久免费观看| 激情五月婷婷综合| 日本欧美视频在线观看| 91原创在线视频| 色哟哟精品视频| 国产精品久久久久久亚洲毛片 | 人人干视频在线| 成人动漫精品一区二区| 亚洲专区中文字幕| 色妞在线综合亚洲欧美| 中国成人亚色综合网站| 国产在线不卡一卡二卡三卡四卡| 色综合天天色综合| 全网国产福利在线播放| 国产精品免费一区二区三区观看| 亚洲欧美久久精品| 美女在线免费视频| 欧美日韩精品欧美日韩精品一| 红桃成人av在线播放| 久久精品91久久久久久再现| 国内精品亚洲| 草草影院在线观看| 亚洲最大成人在线| 欧美日韩免费网站| 日韩国产一区| y4480在线8影院| 亚洲国产精品久久久久久| 精品一二三四区| 一二三在线视频社区| 欧美精品日韩一区| 国产专区精品| 日本午夜精品一区二区| 国产亚洲欧美在线| 亚洲高清国产精品| 一本久久综合亚洲鲁鲁| 亚洲伦理一区| 浮生影视网在线观看免费| 成人女人a毛片在线看| 91xxx在线观看| 精品少妇一区| 色综合久久久久久中文网| 无码小电影在线观看网站免费| 亚洲国产日韩欧美在线图片| 日韩一区二区三区精品| 欧美日韩视频在线一区二区观看视频 | 久久精品国产99国产精品| 国产一级性片| 亚洲成人xxx| 日本视频三区| 欧美色播在线播放| 婷婷激情久久| 色国产在线视频| 色播久久人人爽人人爽人人片视av| 日韩久久久久| 先锋在线资源一区二区三区| 欧美男生操女生| 在线精品视频一区二区三四| 久久久不卡影院| 精品亚洲成a人片在线观看| 精品国产乱码久久久久久蜜臀| 欧美专区视频| 久久99精品久久久久久水蜜桃| 久久先锋影音av鲁色资源| 蜜桃视频在线观看www社区 | 一本色道久久综合亚洲精品按摩| 亚洲天堂av在线| 国产狼人综合免费视频| 国产在线不卡一区| 久草在现在线| 九九精品视频在线| 蜜臀久久久99精品久久久久久| 国产激情二区| 久久精品视频在线播放| 日韩精品电影一区亚洲| 亚州色图欧美色图| 97av在线视频| 国产综合久久久久久久久久久久| 男人av在线| 日韩av电影国产| 国产日产欧美一区二区视频| 九色porny丨入口在线| 好吊色欧美一区二区三区四区 | 国产精品久久久久久久久借妻 | 久久久久久久久综合| 丝袜诱惑制服诱惑色一区在线观看| 国模私拍视频| 久久亚洲影音av资源网| 久久99精品国产麻豆婷婷| а天堂8中文最新版在线官网| 日韩av成人在线| 久久久久久久性| 日韩国产91| 黄色一级视频在线播放| 国产偷国产偷亚洲清高网站| 久久综合九色综合欧美狠狠| 婷婷在线视频| 国产一区精品视频| 欧美在线视频日韩| 91视频精品| 午夜在线网站| 国产日本欧美一区二区三区在线| 中文字幕亚洲精品在线观看| 国产精品一区二区三区美女| 天天操天天爱天天爽| 欧美激情在线观看| 亚洲欧洲精品一区二区三区| 思热99re视热频这里只精品| 快播av资源| 亚洲伊人久久大香线蕉av| 色综合久久综合| 在线看片一区| 国产在线一区二区视频| 精品一区二区三区国产| 3d动漫精品啪啪| 日韩不卡在线观看日韩不卡视频| 污视频网站在线免费| 中文字幕日韩一区二区三区| 亚洲色图狂野欧美| 不卡一区二区在线| 亚洲免费一区三区| 麻豆av在线| 成人区精品一区二区| 91精品国产综合久久福利| 日韩中文字幕区一区有砖一区 | 一区精品在线播放| 牛牛精品成人免费视频| 女人黄色片免费| 92看片淫黄大片欧美看国产片| 动漫精品一区二区| aa亚洲婷婷| 依依综合在线| 国产一级做a爰片久久| 国产精品国产自产拍高清av水多 | 亚洲三级色网| 制服丝袜在线播放| 一二三四中文字幕| 精品自在线视频| 亚洲午夜久久久久久久久电影网| 亚洲色图国产| 日韩三级免费| 久久福利一区二区| 欧美另类xxx| 姬川优奈aav一区二区| 久久久久久婷| 国产高清日韩| 久久久久久久久亚洲精品| 婷婷四房综合激情五月| 久久久精品一区二区| 黄色精品在线看| 国产乱人伦偷精品视频不卡| 台湾亚洲精品一区二区tv|