摘要:單例模式被認為是最簡單的設計模式,屬于創建型設計模式又被分為創建型結構型和行為型,經常被用到,下面以我在實際項目中用到的一個單例模式為例,看下如何利用經典的兩次判空方法令其高效安全得工作在多線程環境見代碼中注釋。
單例模式被認為是最簡單的設計模式,屬于創建型(設計模式又被分為:創建型、結構型和行為型),經常被用到,下面以我在實際項目中用到的一個單例模式為例,看下如何利用經典的兩次判空方法令其高效、安全得工作在多線程環境(見代碼中注釋)。
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; // 屏蔽默認的公共構造函數 private SqlSessionFactorySingleton() { } public static SqlSessionFactory getInstance() { if (factory == null) { // 第一次判空 // 只有創建SqlSessionFactory實例時才需要同步,不直接在方法上加synchronized關鍵字可以避免在每次判斷實例是否創建時加鎖,極大得提高并發效率 synchronized (SqlSessionFactorySingleton.class) { // 如果A、B兩個線程同時通過第一次判空,A獲得鎖,B等待,等A創建完SqlSessionFactory實例釋放鎖,B獲得鎖,此時B需要再次判斷實例是否已創建來避免重復創建 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; } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74596.html
摘要:防止指令重排序防止時指令重排序導致其他線程獲取到未初始化完的對象。枚舉類默認枚舉實例的創建是線程安全的,所以不需要擔心線程安全的問題。 單例模式是23種GOF模式中最簡單,也是最經常出現的一種設計模式,也是面試官最常愛考的一種模式,為什么呢?因為單例模式足夠簡單,編寫一個單例模式代碼幾分鐘就能搞定,所以設計模式中面試官通常會選取單例模式作為出題。下面把單例模式分幾個點,分別說說哪些地方...
摘要:關于對于重排序的講解,強烈推薦閱讀程曉明寫的深入理解內存模型二重排序。語義語義單線程下,為了優化可以對操作進行重排序。編譯器和處理器為單個線程實現了語義,但對于多線程并不實現語義。雙重加載的單例模式分析即雙重檢查加鎖。 版權聲明:本文由吳仙杰創作整理,轉載請注明出處:https://segmentfault.com/a/1190000009231182 1. 引言 在開始分析雙重加鎖單...
摘要:在設計模式一書中,將單例模式稱作單件模式。通過關鍵字,來保證不會同時有兩個線程進入該方法的實例對象改善多線程問題為了符合大多數程序,很明顯地,我們需要確保單例模式能在多線程的情況下正常工作。 在《Head First 設計模式》一書中,將單例模式稱作單件模式。這里為了適應大環境,把它稱之為大家更熟悉的單例模式。 一、了解單例模式 1.1 什么是單例模式 單例模式確保一個類只有一個實例,...
摘要:下面我們來看看看中的單例模式,中使用的是單例注冊表的特殊方式實現的單例模式,所以說模式是死的,需要靈活得運用。 本文循序漸進介紹單例模式的幾種實現方式,以及Jdk中使用到單例模式的例子,以及sring框架中使用到的單例模式例子。 餓漢式 package signgleton; /** * 單例模式簡單的實現 */ public class Singleton { priv...
閱讀 695·2021-11-15 11:37
閱讀 3316·2021-10-27 14:14
閱讀 6039·2021-09-13 10:30
閱讀 2961·2021-09-04 16:48
閱讀 1926·2021-08-18 10:22
閱讀 2125·2019-08-30 14:19
閱讀 730·2019-08-30 10:54
閱讀 1745·2019-08-29 18:40