。。。
/**
饿汉式
类加载到内存,就实例化一个单例。jvm保证线程安全
简单实用,推荐实用
唯一缺点:不管用到与否,类加载时就完成实例化。
*/
public class Single01{
private static final Single01 INSTANCE = new Single01();
private Single01(){}
public static Single01 getInstance(){return INSTANCE;}
}
/**
和01没区别,只是用静态语句块,写法不一样而已。
*/
public class Single02{
private static final Single02 INSTANCE;
static{INSTANCE = new Single02();}
private Single02(){}
public static Single02 getInstance(){return INSTANCE;}
}
/**
lazy loading
懒汉式
按需初始化,但线程不安全
*/
public class Single03{
private static Single03 INSTANCE;
private Single03(){}
public static Single03 getInstance(){
if(INSTANCE == null){INSTANCE = new Single03();}
return INSTANCE;}
}
测试代码(多条线程)
public class Single03{
private static Single03 INSTANCE;
private Single03(){}
public static Single03 getInstance(){
if(INSTANCE == null){
//因为CPU太快,第2条线程还没进来,第1条线程已经执行完了
Thread.sleep(1);//睡1毫秒,为了让其他线程进来。
INSTANCE = new Single03();}
return INSTANCE;}
public static void main(String[] args){for(int i=0;i<100;i++){
new Thread(()->{System.out.println(Single03.getInstance().hashCode());}).start();
}}
}
/**
在03基础上直接加锁,但效率低了
*/
public class Single04{
private static Single04 INSTANCE;
private Single04(){}
public static synchronized Single04 getInstance(){
if(INSTANCE == null){INSTANCE = new Single04();}
return INSTANCE;}
}
测试代码(多条线程)
public class Single04{
private static Single04 INSTANCE;
private Single04(){}
public static synchronized Single04 getInstance(){
if(INSTANCE == null){
//因为CPU太快,第2条线程还没进来,第1条线程已经执行完了
Thread.sleep(1);//睡1毫秒,为了让其他线程进来。
INSTANCE = new Single04();}
return INSTANCE;}
public static void main(String[] args){for(int i=0;i<100;i++){
new Thread(()->{System.out.println(Single04.getInstance().hashCode());}).start();
}}
}
。。。
联系客服