singleton:单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点
一个简单的单例模式
class Singleton{
private static Singleton singleton;
private Singleton(){
}
public static Singleton getSingleton(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
public static void main(String[] args) {
Singleton s1=Singleton.getSingleton();
Singleton s2=Singleton.getSingleton();
if(s1==s2){
System.out.println("两个对象是相同的实例!");
}
}
单例模式的好处:因为Singleton类封装它的唯一实例,这样可以严格的控制客户怎样访问它以及何时访问它。简单的说就是对唯一实例的受控访问!
单例和使用类(如Math)的不同点:
使用类不保存状态,仅提供一些静态方法和静态属性让外界使用,不可继承,实用类就是一些方法的合集
单例类有状态,可以被继承,单例就是有着唯一对象的实例。
多线程时的单例(懒汉模式)
class Singleton{
private static Singleton singleton;
private static final Object obj=new Object();
private Singleton(){
}
public static Singleton getSingleton(){
if(singleton==null){
synchronized (obj) {
if(singleton==null){//防止多线程安全问题
singleton=new Singleton();
}
}
}
return singleton;
}
}
饿汉模式
class Singleton {
private static final Singleton singleton= new Singleton();;
private Singleton() {
}
public static Singleton getSingleton() {
return singleton;
}
}