自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不是我看不起你?我猜你只知道兩種單例模式

開(kāi)發(fā) 前端
單例模式保證了系統(tǒng)內(nèi)存中該類(lèi)只存在一個(gè)對(duì)象,節(jié)省了系統(tǒng)資源,對(duì)于一些需要頻繁創(chuàng)建銷(xiāo)毀的對(duì)象, 使用單例模式可以提高系統(tǒng)性能。

定義

單例設(shè)計(jì)模式,就是采取一定的方法保證在整個(gè)的軟件系統(tǒng)中,對(duì)某個(gè)類(lèi)只能存在一個(gè)對(duì)象實(shí)例,并且該類(lèi)只提供一個(gè)取得其對(duì)象實(shí)例的方法(靜態(tài)方法)。

使用場(chǎng)景

  • 對(duì)于一些需要頻繁創(chuàng)建銷(xiāo)毀的對(duì)象
  • 重量級(jí)的對(duì)象
  • 經(jīng)常使用到的對(duì)象
  • 工具類(lèi)對(duì)象
  • 數(shù)據(jù)源
  • session

單例模式八種方式

餓漢式(靜態(tài)常量)

/**
* 餓漢式(靜態(tài)常量)
* 優(yōu)勢(shì):簡(jiǎn)單,避免多線(xiàn)程的同步問(wèn)題
* 劣勢(shì):無(wú)懶加載,內(nèi)存浪費(fèi)
* @author:liyajie
* @createTime:2022/2/10 15:50
* @version:1.0
*/
public class Singleton1 {
// 私有化構(gòu)造方法
private Singleton1(){}

// 靜態(tài)常量
private static final Singleton1 singleton1 = new Singleton1();

// 對(duì)外提供公共方法
public static Singleton1 getSingleton1(){
return singleton1;
}
}

分析

  • 優(yōu)勢(shì):簡(jiǎn)單,避免多線(xiàn)程的同步問(wèn)題。
  • 劣勢(shì):無(wú)懶加載,內(nèi)存浪費(fèi)

餓漢式(靜態(tài)代碼塊)

/**
* 餓漢式(靜態(tài)代碼塊)
* 優(yōu)勢(shì):簡(jiǎn)單,避免多線(xiàn)程的同步問(wèn)題
* 劣勢(shì):無(wú)懶加載,內(nèi)存浪費(fèi)
* @author:liyajie
* @createTime:2022/2/10 15:50
* @version:1.0
*/
public class Singleton2 {
// 私有化構(gòu)造方法
private Singleton2(){}

private static final Singleton2 singleton2;

// 靜態(tài)代碼塊
static {
singleton2 = new Singleton2();
}

// 對(duì)外提供公共方法
public static Singleton2 getSingleton2(){
return singleton2;
}
}

分析

  • 優(yōu)勢(shì):簡(jiǎn)單,避免多線(xiàn)程的同步問(wèn)題
  • 劣勢(shì):無(wú)懶加載,內(nèi)存浪費(fèi)。

懶漢式(線(xiàn)程不安全)

/**
* 懶漢式(線(xiàn)程不安全)
* @author:liyajie
* @createTime:2022/2/10 15:50
* @version:1.0
*/
public class Singleton3 {
// 私有化構(gòu)造方法
private Singleton3(){}

// 內(nèi)部屬性
private static Singleton3 singleton3;

// 對(duì)外提供公共方法
public static Singleton3 getSingletons(){
if(singleton3 == null){
singleton3 = new Singleton3();
}
return singleton3;
}
}

分析

  • 優(yōu)勢(shì):起到了懶加載的效果 不會(huì)造成內(nèi)存浪費(fèi)
  • 劣勢(shì):線(xiàn)程不安全 不推薦這種方式的。

懶漢式(同步方法)

/**
* 懶漢式(同步方法)
* 優(yōu)勢(shì):解決了線(xiàn)程同步問(wèn)題
* 劣勢(shì):使用synchronized同步關(guān)鍵字,性能太低
* @author:liyajie
* @createTime:2022/2/10 15:50
* @version:1.0
*/
public class Singleton4 {
// 私有化構(gòu)造方法
private Singleton4(){}

// 內(nèi)部屬性
private static Singleton4 singleton4;

// 對(duì)外提供公共方法
public static synchronized Singleton4 getSingleton4(){
if(singleton4 == null){
singleton4 = new Singleton4();
}
return singleton4;
}
}

分析

  • 優(yōu)勢(shì):解決了線(xiàn)程安全問(wèn)題
  • 劣勢(shì):效率太低。

懶漢式(同步代碼塊)

/**
* 懶漢式(同步代碼塊)
* @author:liyajie
* @createTime:2022/2/10 15:50
* @version:1.0
*/
public class Singleton5 {
// 私有化構(gòu)造方法
private Singleton5(){}

// 內(nèi)部屬性
private static Singleton5 singleton5;

// 對(duì)外提供公共方法
public static Singleton5 getSingleton5(){
if (singleton5 == null){
synchronized (Singleton5.class){
singleton5 = new Singleton5();
}
}
return singleton5;
}
}

分析

  • 優(yōu)勢(shì):起到了懶加載的效果 不會(huì)造成內(nèi)存浪費(fèi)
  • 劣勢(shì):線(xiàn)程不安全 不推薦這種方式的。

雙重檢查鎖方式

/**
* 雙重檢查鎖機(jī)制
* @author:liyajie
* @createTime:2022/2/10 15:50
* @version:1.0
*/
public class Singleton6 {
// 私有化構(gòu)造方法
private Singleton6(){}

// 內(nèi)部屬性
private volatile static Singleton6 singleton6;

// 對(duì)外提供公共方法
public static Singleton6 getSingleton6(){
if (singleton6 == null){
synchronized (Singleton6.class){
if(singleton6 == null){
singleton6 = new Singleton6();
}
}
}
return singleton6;
}
}

分析

  • 實(shí)現(xiàn)了懶加載,效率很高,解決了線(xiàn)程安全。

靜態(tài)內(nèi)部類(lèi)方式

/**
* 靜態(tài)內(nèi)部類(lèi)
* @author:liyajie
* @createTime:2022/2/10 15:50
* @version:1.0
*/
public class Singleton7 {
// 私有化構(gòu)造方法
private Singleton7(){}

// 內(nèi)部類(lèi)
private static class SingleInstance{
public static final Singleton7 singleton7 = new Singleton7();
}

// 對(duì)外提供公共方法
public static Singleton7 getSingleton7(){
return SingleInstance.singleton7;
}
}

分析

  • 不會(huì)出現(xiàn)線(xiàn)程安全問(wèn)題 JVM來(lái)幫我們保證了線(xiàn)程的安全性。
  • 利用靜態(tài)內(nèi)部類(lèi)的特點(diǎn),效率也很高
  • 實(shí)際開(kāi)發(fā)中推薦使用的。

枚舉方式

定義單例對(duì)象

/**
* @desc:
* @author:liyajie
* @createTime:2022/2/11 10:25
* @version:1.0
*/
public class Singleton {

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

定義枚舉實(shí)例化單例對(duì)象

/**
* 枚舉方式
* @author:liyajie
* @createTime:2022/2/10 15:50
* @version:1.0
*/
enum Singleton8 {
// 相當(dāng)于public static final Singleton8 INSTANCE;
// 保證了枚舉實(shí)例只能被實(shí)例化一次
INSTANCE;

// 定義單例變量
private Singleton singleton;

// 枚舉構(gòu)造方法,該構(gòu)造方法是private,執(zhí)行構(gòu)造方法的時(shí)候,同時(shí)創(chuàng)建我們的單例對(duì)象
Singleton8() {
singleton = new Singleton();
}

// 對(duì)外提供公共方法
public Singleton getSingleton() {
return singleton;
}
}

使用方法

Singleton8.INSTANCE.getSingleton()即可獲取我們的單例對(duì)象了。

分析

  • 簡(jiǎn)單,避免了線(xiàn)程安全問(wèn)題
  • 實(shí)際開(kāi)發(fā)中推薦使用的。

總結(jié)

單例模式保證了系統(tǒng)內(nèi)存中該類(lèi)只存在一個(gè)對(duì)象,節(jié)省了系統(tǒng)資源,對(duì)于一些需要頻繁創(chuàng)建銷(xiāo)毀的對(duì)象, 使用單例模式可以提高系統(tǒng)性能。

當(dāng)想實(shí)例化一個(gè)單例類(lèi)的時(shí)候,必須要記住使用相應(yīng)的獲取對(duì)象的方法,而不是使用new。

單例模式推薦使用的方法有內(nèi)部靜態(tài)類(lèi)方式和枚舉方式。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2018-04-03 15:38:07

Java單例模式模式設(shè)計(jì)

2020-04-27 08:31:29

單例模式Python軟件設(shè)計(jì)模式

2020-12-17 08:56:51

單例模式JVM

2012-05-11 09:13:28

程序員開(kāi)發(fā)者

2021-01-06 08:48:35

CSS 命名模塊

2019-04-30 15:10:42

Python調(diào)試工具編程語(yǔ)言

2012-03-26 15:08:22

我畫(huà)你猜

2012-03-28 22:12:00

游戲

2015-07-21 10:09:13

iOSCoreLocatio

2021-08-05 15:04:14

消息隊(duì)列后端

2022-08-08 20:33:12

VolatileJVM

2011-02-21 16:47:03

Integer

2024-11-08 08:34:59

RocketMQ5.Remoting通信

2020-04-27 10:34:23

HTTPDNSDNS網(wǎng)絡(luò)協(xié)議

2023-12-05 08:20:05

單例模式Python

2012-11-05 10:18:21

云存儲(chǔ)你畫(huà)我猜云服務(wù)

2022-02-15 20:08:41

JDKJavaWindows

2009-11-06 12:59:56

WCF服務(wù)通信

2024-10-18 14:29:28

2023-01-13 16:53:17

Annotation底層元注解
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)