亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

多線程安全的單例模式

mating / 1706人閱讀

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

單例模式被認(rèn)為是最簡(jiǎn)單的設(shè)計(jì)模式,屬于創(chuàng)建型(設(shè)計(jì)模式又被分為:創(chuàng)建型、結(jié)構(gòu)型和行為型),經(jīng)常被用到,下面以我在實(shí)際項(xiàng)目中用到的一個(gè)單例模式為例,看下如何利用經(jīng)典的兩次判空方法令其高效、安全得工作在多線程環(huán)境(見(jià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關(guān)鍵字令A(yù)線程的修改對(duì)B線程立即可見(jiàn)
    private static volatile SqlSessionFactory factory = null;
    
    // 屏蔽默認(rèn)的公共構(gòu)造函數(shù)
    private SqlSessionFactorySingleton() {
    }

    public static SqlSessionFactory getInstance() {
        if (factory == null) { // 第一次判空
            // 只有創(chuàng)建SqlSessionFactory實(shí)例時(shí)才需要同步,不直接在方法上加synchronized關(guān)鍵字可以避免在每次判斷實(shí)例是否創(chuàng)建時(shí)加鎖,極大得提高并發(fā)效率
            synchronized (SqlSessionFactorySingleton.class) {
                // 如果A、B兩個(gè)線程同時(shí)通過(guò)第一次判空,A獲得鎖,B等待,等A創(chuàng)建完SqlSessionFactory實(shí)例釋放鎖,B獲得鎖,此時(shí)B需要再次判斷實(shí)例是否已創(chuàng)建來(lái)避免重復(fù)創(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/74596.html

相關(guān)文章

  • 面試官所認(rèn)為單例模式

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

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

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

    HackerShell 評(píng)論0 收藏0
  • Java 設(shè)計(jì)模式單例模式

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

    everfight 評(píng)論0 收藏0
  • 設(shè)計(jì)模式系列之單例模式

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

    Jason 評(píng)論0 收藏0
  • 設(shè)計(jì)模式單例模式

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

    陸斌 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<