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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 单例 性能_java程序性能优化之设计优化---单例pk

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 单例 性能_java程序性能优化之设计优化---单例pk 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于單例,很多人就要問了。為什么要使用單例,單例意義何在?

單例的產生是由于類的頻繁使用,每次生成對象都要new,使用完值后GC要釋放對象。這樣一來系統性能降低,GC承受著巨大的壓力。為了能夠提升系統性能或其他,以及減輕GC壓力。我們引進了單例模式。

首先我們來看三個經典的單例模式

import java.util.Map;

import java.util.HashMap;

class Single1 {

static Single1 single = null;

private Single1() {

}

public synchronized static Single1 getInstance() {

if(single==null) {

single= new Single1();

}

return single;

}

}

/**

*單例模式類

*@author qxh

*@version 1.0 2015/6/13

*/

class Single2{

private static final Single2 instance;//靜態變量存放對象的引用

/**

*私有的構造方法

*

*/

private Single2() {

}

/**

*靜態初始化塊進行初始化

*

*/

static {

instance=new Single2();

}

/**

*獲取單例對象的方法

*@param 無

*@return 存放該對象地址的引用

*/

public static Single2 getInstance() {

return instance;

}

}

class Single3 {

static Map single_map= new HashMap();

private Single3() {

}

static {

Single3 single = new Single3();

single_map.put(single.getClass().getName(),single);

}

public static Single3 getInstance(String name) {

if(name==null) {

name = Single3.class.getName();

}

if(single_map.get(name)==null) {

try{

single_map.put(name,(Single3)Class.forName(name).newInstance());

}catch(Exception e) {

}

}

return single_map.get(name);

}

}

class TestThread extends Thread {

public void run() {

long begin=System.currentTimeMillis();

for(int i=1;i<100000;i++)

//Single1.getInstance();//耗時about46

//Single2.getInstance();//耗時0

Single3.getInstance(null);//耗時0

System.out.println("spend: " +(System.currentTimeMillis()-begin));

}

}

public class Single {

public static void main(String[] args) {

TestThread t1 = new TestThread();

TestThread t2 = new TestThread();

TestThread t3 = new TestThread();

TestThread t4 = new TestThread();

TestThread t5 = new TestThread();

t1.start();

t2.start();

t3.start();

t4.start();

t5.start();

}

}

我們先來看下第二種一開始就用初始化塊進行單例初始化,這樣雖然可以避免多線程下造成的數據混亂但是沒有做到延遲加載,可能會使程序初始化較慢,第一種方式為了用了延遲加載,加了鎖,雖然做到同步和延遲加載,但為了延遲加載,而犧牲系統系能未免不妥。第三種登記注冊式單例,由于使用單例類名作為key而map集合又不可重復再加上構造方法私有,由公共方法同過類名得到的實例有且只有一個。這種方式和第二種一樣,做到了同步,卻沒有做到延遲加載。為此我們的程序還需進一步改進。

public class Single{

private Single() {

}

private static class SingleHolder{

private static final Single single = new Single();

}

public static Single getInstance() {

return SingleHolder.single;

}

}

這種單例使用內部類來維護單例模式,當加載Single類時內部類并不會被加載,從而保證單例類不會被初始化,做到了延遲加載。又由于單例類實例的獲得實在內部類加載完(類創建是原子性的非并發)之后才返回的,也就是說第一次初始化調用getInstance()就對單例類對象進行了初始化(類似第一)第二種,所以說對多線程友好。即做到了延遲加載又做到多線程友好。系統初始化和系統性能都能得到提升。

總結

以上是生活随笔為你收集整理的java 单例 性能_java程序性能优化之设计优化---单例pk的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。