单例懒汉模式:对象的初始化在调用获得对象的方法后完成
*************************
方式一:双重检查锁
class Single3{
private static volatile Single3 single3;
private Single3(){
}
public static Single3 getInstance(){
if(single3==null){
synchronized (Single3.class){
if(single3==null){
single3=new Single3();
}
}
}
return single3;
}
}
class Thread3 implements Runnable{
@Override
public void run() {
System.out.println(Single3.getInstance());
}
}
public class SingleTest3 {
public static void main(String[] args){
ExecutorService executorService= Executors.newFixedThreadPool(5);
for(int i=0;i<5;i++){
Thread3 t=new Thread3();
executorService.submit(t);
}
}
}
*******************
控制台输出
singletest.Single3@5d64efdc
singletest.Single3@5d64efdc
singletest.Single3@5d64efdc
singletest.Single3@5d64efdc
singletest.Single3@5d64efdc
*******************************
方式二:静态内部类
class Single4{
private static class Single{
private static Single4 single4=new Single4();
}
private Single4(){
}
public static Single4 getInstance(){
return Single.single4;
}
}
class Thread4 implements Runnable{
@Override
public void run() {
System.out.println(Single4.getInstance());
}
}
public class SingleTest4 {
public static void main(String[] args){
ExecutorService executorService= Executors.newFixedThreadPool(5);
for(int i=0;i<5;i++){
Thread4 t=new Thread4();
executorService.submit(t);
}
}
}
*******************
控制台输出
singletest.Single4@23893204
singletest.Single4@23893204
singletest.Single4@23893204
singletest.Single4@23893204
singletest.Single4@23893204