1. 程式人生 > >單例模式的設計與實現,及效能測試

單例模式的設計與實現,及效能測試

單例模式在實際應用中使用非常廣泛,比如日誌寫入,單例模式可以避免錯誤,資料庫連線可以避免鎖死,用例執行可以避免重複呼叫。

先是列舉實現法:

public enum Singleton01 {
	INSTANCE;

	public void operator() {
		System.out.println("Operator");
	}
}

再是內部類實現法:
public class Singleton02 {
	private static class Module {
		private static final Singleton02 instance = new Singleton02();
	}

	private Singleton02() {
		;
	}

	public static Singleton02 getInstance() {
		return Module.instance;
	}
}

再是餓漢式:
public class Singleton03 {
	private static final Singleton03 instance = new Singleton03();

	private Singleton03() {
	}
	
	public static Singleton03 getInstance() {
		return instance;
	}
}

再是懶漢式:
public class Singleton04 {
	private static Singleton04 instance;

	private Singleton04() {
	}
	
	public synchronized static Singleton04 getInstance() {
		if (instance == null) {
			instance = new Singleton04();
		}
		return instance;
	}
}

下面是測試程式:
import java.util.concurrent.CountDownLatch;

public class Client2 {
	private static int threadCount = 10;
	private static long jobCountPerThread = 1000000L;

	public static void main(String[] args) throws InterruptedException {
		testEnum();
		testInnerClass();
		testHungeryClass();
		testLazyClass();
	}

	public static void testEnum() throws InterruptedException {
		long startTime = System.currentTimeMillis();

		CountDownLatch countDownLatch = new CountDownLatch(threadCount);

		for (int i = 0; i < threadCount; i++) {
			new Thread(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					for (int i = 0; i < jobCountPerThread; i++) {
						Singleton01 s1 = Singleton01.INSTANCE;
					}

					countDownLatch.countDown();
				}

			}).start();
		}

		countDownLatch.await();
		long endTime = System.currentTimeMillis();
		System.out.println("列舉單例模式總消耗時間:" + (endTime - startTime) + "毫秒");
	}

	public static void testInnerClass() throws InterruptedException {
		long startTime = System.currentTimeMillis();
		CountDownLatch countDownLatch = new CountDownLatch(threadCount);

		for (int i = 0; i < threadCount; i++) {
			new Thread(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					for (int i = 0; i < jobCountPerThread; i++) {
						Singleton02 s1 = Singleton02.getInstance();
					}

					countDownLatch.countDown();
				}

			}).start();
		}

		countDownLatch.await();
		long endTime = System.currentTimeMillis();
		System.out.println("內部類單例模式總消耗時間:" + (endTime - startTime) + "毫秒");
	}

	public static void testHungeryClass() throws InterruptedException {
		long startTime = System.currentTimeMillis();
		CountDownLatch countDownLatch = new CountDownLatch(threadCount);

		for (int i = 0; i < threadCount; i++) {
			new Thread(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					for (int i = 0; i < jobCountPerThread; i++) {
						Singleton03 s1 = Singleton03.getInstance();
					}

					countDownLatch.countDown();
				}

			}).start();
		}

		countDownLatch.await();
		long endTime = System.currentTimeMillis();
		System.out.println("餓漢式單例模式總消耗時間:" + (endTime - startTime) + "毫秒");
	}

	public static void testLazyClass() throws InterruptedException {
		long startTime = System.currentTimeMillis();
		CountDownLatch countDownLatch = new CountDownLatch(threadCount);

		for (int i = 0; i < threadCount; i++) {
			new Thread(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					for (int i = 0; i < jobCountPerThread; i++) {
						Singleton04 s1 = Singleton04.getInstance();
					}

					countDownLatch.countDown();
				}

			}).start();
		}

		countDownLatch.await();
		long endTime = System.currentTimeMillis();
		System.out.println("懶漢式單例模式總消耗時間:" + (endTime - startTime) + "毫秒");
	}
}

最後就很簡單了,執行起來,可以看到各個不同的模式的效率:


由圖上很簡單可以看出,各自不同的特點,除了懶漢式,其它幾種效率都不錯,但是餓漢式因為不是延遲載入,所以某些場合下不適合,可能會造成開銷增加,懶漢式支援延遲載入,但是因為執行緒安全問題,所以效率下降比較嚴重,考慮綜合因素,結論是列舉型別是執行緒安全效率又高的,同時是非延遲載入的,內部類是支援延遲載入的,也是執行緒安全的,而且效能也不錯。

相關推薦

模式設計實現效能測試

單例模式在實際應用中使用非常廣泛,比如日誌寫入,單例模式可以避免錯誤,資料庫連線可以避免鎖死,用例執行可以避免重複呼叫。 先是列舉實現法: public enum Singleton01 { INSTANCE; public void operator() { S

Java設計模式菜鳥系列(六)模式建模實現

單例模式(Singleton):是一種常用的設計模式。在Java應用中,單例物件能保證在一個JVM中,該物件只有一個例項存在。好處主要有:1、某些類建立比較頻繁,對於一些大型的物件,這是一筆很大的系統開銷。2、省去了new操作符,降低了系統記憶體的使用頻率,減輕GC壓

Android 模式幾種實現方式簡析

一.定義: 確保某一個類只有一個例項,而且自行例項並向整個系統提供這個例項 二.使用場景: 避免產生過多的物件消耗過多的資源,或者某種型別的物件只應該有且只有一個。例如,建立一個物件需要消耗的資源過多,如訪問資料庫或者IO 資源。 三.實現單例模式的關鍵

設計模式-模式(餓漢式懶漢式的Java實現

單例模式 單例模式在程式設計中使用的頻率非常之高,其設計的目的是為了在程式中提供唯一一個物件(保證只被構造一次),例如寫入日誌的log物件,windows的工作管理員實現(只能開啟一個)。這裡主要介紹單例模式使用Java的實現(包括餓漢式及懶漢式)。 實現

設計模式模式>>應用場景實現

arr unit 應用 lose sys time 初始 sin turn 定義 單例模式(Singleton),也叫單子模式,是一種常用的軟件設計模式。對於系統而言該實例有且僅有一個。 應用場景 線程池、數據庫池、用於對系統做初始化的實例,提供給關聯系統調用的接口(

設計模式之“模式”C++/python實現

       單例模式用來只允許建立一個例項的類,比如一個系統中只能有一個工作管理員,對於單伺服器多客戶端系統,伺服器也應該設為單例的。        對於C++單例模式需要滿足以下三點:        1)單例模式的類只提供私有的建構函式;        2)是類定義

模式---懶漢餓漢模式和靜態內部類實現

單例模式是最基本的 java 設計模式之一 主要有兩種設計方法,主要分為餓漢式與懶漢式 餓漢式比較簡單,直接使用常量即可,主要程式碼如下: private static final SingleModel INSTANCE = new Sing

java設計模式模式(幾種寫法比較)

概念:  java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裡主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。  單例模式有以下特點:  1、單例類只能有一個例項。  2、單例類必須自己建立自己的唯一例項。  3、單例類必須給所有其他物件提供這一例項。 

設計模式2——模式(singleton)五種構建方法(最喜歡列舉和內部類方式)

單例模式,在配置檔案的時候用的比較多,各處的配置都保持統一性。 一、什麼是單例模式? layout title folder permalink categories tags

設計模式——模式(C++實現

一、單例模式定義: 保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點,該例項被所有程式模組共享。 二、應用場景: 比如在某個伺服器程式中,該伺服器的配置資訊存放在一個檔案中,這些配置資料由一個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置

js模式的es5實現和es6實現以及通用惰性實現

單例模式 es5實現 es6實現 單例模式 一開始不建立例項物件,當第一次使用時才建立 用一個變數標誌當前是否已經為某個類建立過物件,如果已建立則在下次獲取時返回之前建立的例項

c++、設計模式模式(餓漢懶漢執行緒安全)

單例模式:單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個例項。即一個類只有一個物件例項。如何保證一個類只有一個例項並且這個例項易於被訪問呢?定義一個全域性變數可以確保物件隨時都可以被訪

設計模式之——模式(Singleton)的實現、優缺點和常見應用場景

單例模式(Singleton)也叫單態模式,是設計模式中最為簡單的一種模式,甚至有些模式大師都不稱其為模式,稱其為一種實現技巧,因為設計模式講究物件之間的關係的抽象,而單例模式只有自己一個物件,也因此有些設計大師並把把其稱為設計模式之一。 好多沒怎麼使用過的人可能會想,單例模式感覺不怎麼用到,實際的應

DCL模式中的缺陷模式的其他實現

  DCL:Double Check Lock ,意為雙重檢查鎖。在單例模式中懶漢式中可以使用DCL來保證程式執行的效率。 1 public class SingletonDemo { 2 private static SingletonDemo singletonDemo = null; 3

模式6種實現利弊分析

[TOC] # 單例模式6種實現及利弊分析 單例模式三要素 - **私有的構造方法;** - **指向自己例項的私有靜態引用;** - **以自己例項為返回值的靜態的公有方法** ## **1.餓漢式** ```java public class Singleton { private

模式幾種實現方式

size ron jdk null singleton bsp 還要 一個 fin 1、餓漢式:靜態常量 特點:單例的實例被聲明成static和final變量了,在第一次加載類到內存中時就會初始化,所以會創建實例本身是線程安全的 public class Sin

Java模式幾種實現方式

開始 名稱 常量 就是 多線程開發 靜態代碼塊 浪費 ack 多線程同步 在平時的工作、學員的學習以及面試過程中,單例模式作為一種常用的設計模式,會經常被面試官問到,甚至筆試會要求學員現場默寫,下面將會就單例模式的實現思路和幾種常見的實現方式進行簡單的分享。

網上商城的設計實現最新免費下載

price log status data 網站開發 ren show 需求 下載地址 網上商城的設計與實現,最免費下載 一、網上商城系統的論文 摘 要隨著全球經濟一體化的逐步發展和深入,網上購物已成為一種潮流。目前,網上購物在國際互聯網上可以實現的商務功能已經多樣化

C++之智慧指標和普通指標模式兩種實現

1  問題 實現c++的單例模式,這裡測試分別寫了通過智慧指標返回物件和普通返回指標     2  程式碼測試 include <iostream> #include <mutex> #include <m

C++模式最優實現

單例模式,簡單來說就是整個程式中只允許這一個類存在一個例項化物件。 方法來自大佬博文【戳這裡】。文章分析了各類單例模式的實現,包括餓漢模式,懶漢模式的幾個版本。如果趕時間,想快速上手,看這裡就夠了。 Talk is cheap. Show the code. 【最優實現程式