1. 程式人生 > >Java多執行緒知識點總結——進階篇(五)之多執行緒下的單例模式

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學習筆記react1

ava 不能 success 字符 style 使用 -s 布爾 一次 1.組件的state(狀態) 1.選擇合適的state   state所代表的一個組件UI呈現的完整狀態集又可以分成兩類數據:用作渲染組件時使用到的數據的來源以及用作組件UI展現形式的判斷依據。 示

React學習筆記react2

-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

React1 -- react-router4模組化

本篇內容: 單一的路由無巢狀 多層巢狀路由 獲取路徑中的引數 按需載入 單一的路由無巢狀 routers.js import Home from 'components/Home'; import News from 'components/News'; import

React2 -- 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引擎不用寫程式就可以設定資料同步規則。