成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

多線程安全的單例模式

mating / 1658人閱讀

摘要:單例模式被認為是最簡單的設計模式,屬于創(chuàng)建型設計模式又被分為創(chuàng)建型結(jié)構(gòu)型和行為型,經(jīng)常被用到,下面以我在實際項目中用到的一個單例模式為例,看下如何利用經(jīng)典的兩次判空方法令其高效安全得工作在多線程環(huán)境見代碼中注釋。

單例模式被認為是最簡單的設計模式,屬于創(chuàng)建型(設計模式又被分為:創(chuàng)建型、結(jié)構(gòu)型和行為型),經(jīng)常被用到,下面以我在實際項目中用到的一個單例模式為例,看下如何利用經(jīng)典的兩次判空方法令其高效、安全得工作在多線程環(huán)境(見代碼中注釋)。

package core;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.Reader;
import java.util.Properties;

public class SqlSessionFactorySingleton {
    private static Logger logger = LoggerFactory.getLogger("SqlSessionFactorySingleton");
    private static final String MYBATIS_CONFIG_FILE = "mybatis-config.xml";
    // 使用volatile關鍵字令A線程的修改對B線程立即可見
    private static volatile SqlSessionFactory factory = null;
    
    // 屏蔽默認的公共構(gòu)造函數(shù)
    private SqlSessionFactorySingleton() {
    }

    public static SqlSessionFactory getInstance() {
        if (factory == null) { // 第一次判空
            // 只有創(chuàng)建SqlSessionFactory實例時才需要同步,不直接在方法上加synchronized關鍵字可以避免在每次判斷實例是否創(chuàng)建時加鎖,極大得提高并發(fā)效率
            synchronized (SqlSessionFactorySingleton.class) {
                // 如果A、B兩個線程同時通過第一次判空,A獲得鎖,B等待,等A創(chuàng)建完SqlSessionFactory實例釋放鎖,B獲得鎖,此時B需要再次判斷實例是否已創(chuàng)建來避免重復創(chuàng)建
                if (factory == null) { // 第二次判空
                    String configFile = "config.properties";
                    try (Reader configReader = Resources.getResourceAsReader(configFile); Reader mybatisReader = Resources.getResourceAsReader(MYBATIS_CONFIG_FILE)) {
                        Properties properties = new Properties();
                        properties.load(configReader);
                        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
                        factory = builder.build(mybatisReader, properties);
                    } catch (IOException e) {
                        logger.error("Exception when reading {} and {}:", configFile, MYBATIS_CONFIG_FILE, e);
                    }
                }
            }
        }
        return factory;
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74596.html

相關文章

  • 面試官所認為單例模式

    摘要:防止指令重排序防止時指令重排序?qū)е缕渌€程獲取到未初始化完的對象。枚舉類默認枚舉實例的創(chuàng)建是線程安全的,所以不需要擔心線程安全的問題。 單例模式是23種GOF模式中最簡單,也是最經(jīng)常出現(xiàn)的一種設計模式,也是面試官最常愛考的一種模式,為什么呢?因為單例模式足夠簡單,編寫一個單例模式代碼幾分鐘就能搞定,所以設計模式中面試官通常會選取單例模式作為出題。下面把單例模式分幾個點,分別說說哪些地方...

    codeKK 評論0 收藏0
  • Java 雙重加鎖單例與 java 內(nèi)存重排序特性

    摘要:關于對于重排序的講解,強烈推薦閱讀程曉明寫的深入理解內(nèi)存模型二重排序。語義語義單線程下,為了優(yōu)化可以對操作進行重排序。編譯器和處理器為單個線程實現(xiàn)了語義,但對于多線程并不實現(xiàn)語義。雙重加載的單例模式分析即雙重檢查加鎖。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請注明出處:https://segmentfault.com/a/1190000009231182 1. 引言 在開始分析雙重加鎖單...

    HackerShell 評論0 收藏0
  • Java 設計模式單例模式

    摘要:在設計模式一書中,將單例模式稱作單件模式。通過關鍵字,來保證不會同時有兩個線程進入該方法的實例對象改善多線程問題為了符合大多數(shù)程序,很明顯地,我們需要確保單例模式能在多線程的情況下正常工作。 在《Head First 設計模式》一書中,將單例模式稱作單件模式。這里為了適應大環(huán)境,把它稱之為大家更熟悉的單例模式。 一、了解單例模式 1.1 什么是單例模式 單例模式確保一個類只有一個實例,...

    everfight 評論0 收藏0
  • 設計模式系列之單例模式

    摘要:下面我們來看看看中的單例模式,中使用的是單例注冊表的特殊方式實現(xiàn)的單例模式,所以說模式是死的,需要靈活得運用。 本文循序漸進介紹單例模式的幾種實現(xiàn)方式,以及Jdk中使用到單例模式的例子,以及sring框架中使用到的單例模式例子。 餓漢式 package signgleton; /** * 單例模式簡單的實現(xiàn) */ public class Singleton { priv...

    Jason 評論0 收藏0
  • 設計模式單例模式

    摘要:單例模式關注的重點私有構(gòu)造器線程安全延遲加載序列化和反序列化安全反射攻擊安全相關設計模式單例模式和工廠模式工廠類可以設計成單例模式。 0x01.定義與類型 定義:保證一個類僅有一個實例,并提供一個全局訪問點 類型:創(chuàng)建型 UML showImg(https://segmentfault.com/img/bVbtDJ2?w=402&h=268); 單例模式的基本要素 私有的構(gòu)造方...

    陸斌 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<