Java多執行緒知識點總結——進階篇(五)之多執行緒下的單例模式
餓漢式
餓漢式多執行緒和單執行緒的程式碼是一樣的,如下:
class Single
{
private static final Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
懶漢式
為什麼 synchronized 內部還要再進行一次 非空 判斷呢?
因為假如有一個執行緒A在進入第一個非空判斷後,此時執行緒A的CPU的執行權交出去給另一個執行緒B,也就是執行緒A在這裡停止了。假如此時的執行緒B繼續往下執行,並且已經執行了 s = new Single(); 然後執行緒B執行完了並將執行權交給執行緒A,注意,此時的 s 已經 new 了,按理說是不需要再 new 了,但是當執行緒A繼續往下執行時,執行了 s = new Single(); 但是這不是我們想要的。
所以這就是我們在 synchronized 內部新增一個 非空判斷的原因
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
//--->執行緒A在這裡停住了
synchronized(Single.class)
{
if(s==null)//必須的
//--->執行緒B已經執行完了;
s = new Single();
}
}
return s;
}
}
相關推薦
Java多執行緒知識點總結——進階篇(五)之多執行緒下的單例模式
餓漢式 餓漢式多執行緒和單執行緒的程式碼是一樣的,如下: class Single { private static final Single s = new Single(); p
Java多執行緒知識點總結——進階篇(八) 之 等待喚醒機制 Lock 鎖升級版
JDK1.5 中提供了多執行緒升級解決方案。 將同步 Synchronized 替換成現實 Lock 操作。 將Object中的 wait、notify、notifyAll,替換成了C
Java進階篇(五)——Java的I/O技術
程式中,為了永久的儲存建立的資料,需要將其儲存在磁碟檔案中,以便在其它程式中使用它們。Java的I/O技術可以將資料儲存到文字檔案、二進位制檔案甚至是ZIP壓縮檔案中,以達到永久性儲存資料的要求。 本篇我們要介紹的內容就是Java的I/O技術,即輸入/輸出。 一、輸入/輸出流 流是一組有序的資料序
Java多執行緒之進階篇(二)
概述 1.基本原子類 1.1 AtomicBoolean 1.2 AtomicInteger和AtomicLong 2.引用原子類
Java多執行緒之進階篇(一)
一、執行緒池 1.1 執行緒池的建立 1.1.1 ThreadPoolExecutor 1.1.2 執行緒池的分類
Java語言程式設計-進階篇(七)多執行緒與並行程式設計【上】
1.簡單的多執行緒例子package test; public class hello { public static void main(String args[]){ Runnable printA = new PrintChar('a',100);
【備戰春招/秋招系列】美團Java面經總結進階篇 (附詳解答案)
一 訊息佇列MQ的套路 1.1 介紹一下訊息佇列MQ的應用場景/使用訊息佇列的好處 ①.通過非同步處理提高系統性能 ②.降低系統耦合性 1.2 那麼使用訊息佇列會帶來什麼問題?考慮過這個問題嗎? 1.3 介紹
SQL Server調優系列進階篇(查詢優化器的執行方式)
前言 前面我們的幾篇文章介紹了一系列關於運算子的基礎介紹,以及各個運算子的優化方式和技巧。其中涵蓋:檢視執行計劃的方式、幾種資料集常用的連線方式、聯合運算子方式、並行運算子等一系列的我們常見的運算子。有興趣的童鞋可以點選檢視。 本篇介紹在SQL Server中查詢優化器的工作方式,也就是一個好的執行計劃的
Spring Boot學習進階筆記(五)-添加定時任務
imp 配置 ren 時間 report rate enable lin enables 一、在Spring [email protected]/* */,啟用定時任務的配置。@SpringBootApplication@EnableSchedulingpubl
Python進階內容(五)--- type和object的關系
行動 關系 函數 tex 進階 類模板 clas lin cnblogs 面向對象編程(OOP)的兩大關系 繼承與實現 繼承關系: 子類繼承自父類(base),可以使用父類的一些方法(method)和屬性(attribute) 實現關系: 以類為模板,實例化一個對
shell腳本進階篇(上)
col oss family 指定 -o for循環 用戶輸入 span 創建用戶 shell腳本是我們學習運維的難點,本篇內容簡單舉例shell腳本的進階上篇,有任何技術上的指導,知識上的不足都歡迎指出點明。 流程控制過程式編程語言: 順序執行 選擇執行 循環執行條
React學習筆記之react進階篇(1)
ava 不能 success 字符 style 使用 -s 布爾 一次 1.組件的state(狀態) 1.選擇合適的state state所代表的一個組件UI呈現的完整狀態集又可以分成兩類數據:用作渲染組件時使用到的數據的來源以及用作組件UI展現形式的判斷依據。 示
React學習筆記之react進階篇(2)
-s state ops category strong tro 服務 ive 周期 2.組件與服務器通信 組件的生命周期分為三個階段:掛載階段->更新階段->卸載階段,本文主要集中講述掛載和更新階段組件如何和服務器進行通信。 1.組件掛載階段通信
Vue 進階系列(二)之外掛原理及實現
Vue進階系列彙總如下,歡迎閱讀,歡迎加群討論(文末)。 Vue 進階系列(一)之響應式原理及實現 Vue 進階系列(二)之外掛原理及實現 使用方法 外掛的詳細使用方法詳情看Vue官網 Vue官網之外掛Plugins 概括出來就是 1、通過Vue.use(MyPlugin)使用,
Vue 進階系列(三)之Render函式原理及實現
Vue進階系列彙總如下,歡迎閱讀,歡迎加高階前端進階群一起學習(文末)。 Vue 進階系列(一)之響應式原理及實現 Vue 進階系列(二)之外掛原理及實現 Render函式原理 根據第一篇文章介紹的響應式原理,如下圖所示。 在初始化階段,本質上發生在auto run函式中,然後通過r
React進階篇(1) -- react-router4模組化
本篇內容: 單一的路由無巢狀 多層巢狀路由 獲取路徑中的引數 按需載入 單一的路由無巢狀 routers.js import Home from 'components/Home'; import News from 'components/News'; import
React進階篇(2) -- Redux
前言 如果還不知道為什麼要使用Redux,說明你暫時還不需要它。 三大原則 單一資料來源 整個應用的 state 被儲存在一棵 object tree 中,並且這個 object tree 只存在於唯一一個 store 中。 State 是隻讀的 唯一改變 state 的方法就是觸發 action
軟體測試進階篇(經驗)
出來做軟體測試三,四年了,確實正應了那句“測試不如開發”,只是個人觀點,而且我工作過都是外企和大型國有企業,軟體測試流程和管理都相對很規範化的。 下面幾點給做測試的朋友參考一下: 1、錢肯定少過開發人員,除非你工作七,八年才能拿年薪10W以上,一般的軟體測試工程師很
SODBASE CEP學習進階篇(二)續:日誌採集-Logstash、Kafka和CEP整合
相比Flume,筆者更推薦使用Logstash做日誌採集,見SODBASE CEP學習進階篇(二)續:日誌採集-Logstash、Kafka和CEP整合。如果之前專案中已經選型使用Flume,則本文供參考。 1. 啟動CEP模型 啟動CEP Server ./catalina
SODBASE CEP學習進階篇(七)續:SODBASE CEP與Spark streaming整合-低延遲規則管理 與分散式快取整合
在實際大資料工作中,常常有實時監測資料庫變化或實時同步資料到大資料儲存,解決大資料實時分析的需求。同時,增量同步資料庫資料相比全量查詢也減少了網路頻寬消耗。本文以Mysql的bin-log到Kafka為例,使用Canal Server,通過SODBASE引擎不用寫程式就可以設定資料同步規則。