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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数仓主题表怎么设计_陶瓷企业展厅设计主题
- 下一篇: 加速国内 Github 访问,下载,的9