日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql jdbc 单利_java单利模式设计

發(fā)布時(shí)間:2024/9/27 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql jdbc 单利_java单利模式设计 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java中單例模式是一種常見的設(shè)計(jì)模式,單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。

Singleton是一種創(chuàng)建型模式,指某個(gè)類采用Singleton模式,則在這個(gè)類被創(chuàng)建后,只可能產(chǎn)生一個(gè)實(shí)例供外部訪問,并且提供一個(gè)全局的訪問點(diǎn)。

核心知識(shí)點(diǎn)如下:

(1) 將采用單例設(shè)計(jì)模式的類的構(gòu)造方法私有化(采用private修飾)。

(2) 在其內(nèi)部產(chǎn)生該類的實(shí)例化對(duì)象,并將其封裝成private static類型。

(3) 定義一個(gè)靜態(tài)方法返回該類的實(shí)例。

/*** 方法一

* 單例模式的實(shí)現(xiàn):餓漢式,線程安全 但效率比較低

*/

public classSingletonTest {

// 定義一個(gè)私有的構(gòu)造方法

privateSingletonTest() {

}

// 將自身的實(shí)例對(duì)象設(shè)置為一個(gè)屬性,并加上Static和final修飾符

private static final SingletonTest instance = newSingletonTest();

// 靜態(tài)方法返回該類的實(shí)例

public staticSingletonTest getInstancei() {

returninstance;

}

}

方法一就是傳說的中的餓漢模式

優(yōu)點(diǎn)是:寫起來比較簡(jiǎn)單,而且不存在多線程同步問題,避免了synchronized所造成的性能問題;

缺點(diǎn)是:當(dāng)類SingletonTest被加載的時(shí)候,會(huì)初始化static的instance,靜態(tài)變量被創(chuàng)建并分配內(nèi)存空間,從這以后,這個(gè)static的instance對(duì)象便一直占著這段內(nèi)存(即便你還沒有用到這個(gè)實(shí)例),當(dāng)類被卸載時(shí),靜態(tài)變量被摧毀,并釋放所占有的內(nèi)存,因此在某些特定條件下會(huì)耗費(fèi)內(nèi)存。

/***方法二

* 單例模式的實(shí)現(xiàn):飽漢式,非線程安全

*

*/

public classSingletonTest {

// 定義私有構(gòu)造方法(防止通過 new SingletonTest()去實(shí)例化)

privateSingletonTest() {

}

// 定義一個(gè)SingletonTest類型的變量(不初始化,注意這里沒有使用final關(guān)鍵字)

private staticSingletonTest instance;

// 定義一個(gè)靜態(tài)的方法(調(diào)用時(shí)再初始化SingletonTest,但是多線程訪問時(shí),可能造成重復(fù)初始化問題)

public staticSingletonTest getInstance() {

if (instance == null)

instance = newSingletonTest();

returninstance;

}

}

方法二就是傳說的中的飽漢模式

優(yōu)點(diǎn)是:寫起來比較簡(jiǎn)單,當(dāng)類SingletonTest被加載的時(shí)候,靜態(tài)變量static的instance未被創(chuàng)建并分配內(nèi)存空間,當(dāng)getInstance方法第一次被調(diào)用時(shí),初始化instance變量,并分配內(nèi)存,因此在某些特定條件下會(huì)節(jié)約了內(nèi)存;

缺點(diǎn)是:并發(fā)環(huán)境下很可能出現(xiàn)多個(gè)SingletonTest實(shí)例。

/***方法三

* 單例模式的實(shí)現(xiàn):飽漢式,線程安全簡(jiǎn)單實(shí)現(xiàn)

*

*/

public classSingletonTest {

//定義私有構(gòu)造方法(防止通過 new SingletonTest()去實(shí)例化)

privateSingletonTest() {

}

//定義一個(gè)SingletonTest類型的變量(不初始化,注意這里沒有使用final關(guān)鍵字)

private staticSingletonTest instance;

//定義一個(gè)靜態(tài)的方法(調(diào)用時(shí)再初始化SingletonTest,使用synchronized 避免多線程訪問時(shí),可能造成重的復(fù)初始化問題)

public static synchronizedSingletonTest getInstance() {

if (instance == null)

instance = newSingletonTest();

returninstance;

}

}

方法三為方法二的簡(jiǎn)單優(yōu)化

優(yōu)點(diǎn)是:使用synchronized關(guān)鍵字避免多線程訪問時(shí),出現(xiàn)多個(gè)SingletonTest實(shí)例。

缺點(diǎn)是:同步方法頻繁調(diào)用時(shí),效率略低。

/**

* 方法四

* 單例模式最優(yōu)方案

* 線程安全 并且效率高

*

*/

public class SingletonTest {

// 定義一個(gè)私有構(gòu)造方法

private SingletonTest() {

}

//定義一個(gè)靜態(tài)私有變量(不初始化,不使用final關(guān)鍵字,使用volatile保證了多線程訪問時(shí)instance變量的可見性,避免了instance初始化時(shí)其他變量屬性還沒賦值完時(shí),被另外線程調(diào)用)

private static volatile SingletonTest instance;

//定義一個(gè)共有的靜態(tài)方法,返回該類型實(shí)例

public static SingletonTest getIstance() {

// 對(duì)象實(shí)例化時(shí)與否判斷(不使用同步代碼塊,instance不等于null時(shí),直接返回對(duì)象,提高運(yùn)行效率)

if (instance == null) {

//同步代碼塊(對(duì)象未初始化時(shí),使用同步代碼塊,保證多線程訪問時(shí)對(duì)象在第一次創(chuàng)建后,不再重復(fù)被創(chuàng)建)

synchronized (SingletonTest.class) {

//未初始化,則初始instance變量

if (instance == null) {

instance = new SingletonTest();

}

}

}

return instance;

}

}

方法四為單例模式的最佳實(shí)現(xiàn)。內(nèi)存占用地,效率高,線程安全,多線程操作原子性。

(事實(shí)上,可以通過Java反射機(jī)制來實(shí)例化private類型的構(gòu)造方法,此時(shí)基本上會(huì)使所有的Java單例實(shí)現(xiàn)失效。本帖不討論反射情況下問題,默認(rèn)無(wú)反射,也是常見的面試已經(jīng)應(yīng)用場(chǎng)景)

總結(jié)

以上是生活随笔為你收集整理的mysql jdbc 单利_java单利模式设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。