单例模式必须只有一个实例,并且提供一个全局访问方法。
解析经典单利模式实例:
1 package designPatterns;
2
3 public class Singleton {
4
5 //利用一个静态变量来记录类的唯一实例
6
7 private static Singleton uniqueInstance;
8
9 //声明私有构造器,只有本类可以调用该构造器
10
11 private Singleton(){}
12
13 //创建一个静态的方法获取实例对象
14
15 public static Singleton getSingletonObj(){
16
17 if(uniqueInstance==null){
18
19 uniqueInstance=new Singleton();
20
21 }
22
23 return uniqueInstance;
24
25 }
26
27 }
View Code
解决多线程同步问题:
-
添加线程同步synchronize
例如:每次都进行同步效率较低,适用于较少适用对象场合
package designPatterns.singleton;
public class Singleton {
//利用一个静态变量来记录类的唯一实例
private static Singleton uniqueInstance;
//声明私有构造器,只有本类可以调用该构造器
private Singleton(){}
//创建一个静态的方法获取实例对象(synchronized多线程处理,保证只有一个实例)
public static synchronized Singleton getSingletonObj(){
if(uniqueInstance==null){
uniqueInstance=new Singleton();
}
return uniqueInstance;
}
}
2.创建急切单利模式:长时间占用内存(适用与频繁适用对象场合)
public class Singleton {
//利用一个静态变量来记录类的唯一实例
private static Singleton uniqueInstance=new Singleton();;
//声明私有构造器,只有本类可以调用该构造器
private Singleton(){}
//创建一个静态的方法获取实例对象(synchronized多线程处理,保证只有一个实例)
public static Singleton getSingletonObj(){
return uniqueInstance;
}
}
3.双重检查加锁:
例如:只有第一次创建对象的时候才进行同步(volatile只用于JDK4.0以上版本)
public class Singleton {
//利用一个静态变量来记录类的唯一实例
private static volatile Singleton uniqueInstance ;
//声明私有构造器,只有本类可以调用该构造器
private Singleton(){}
//创建一个静态的方法获取实例对象(synchronized多线程处理,保证只有一个实例)
public static Singleton getSingletonObj(){
if(uniqueInstance==null){
synchronized(Singleton.class){
uniqueInstance=new Singleton();
}
}
return uniqueInstance;
}
}