1.Singleton 的核心就是-》一个类只有唯一的一个实例
2.为什么要用Singleton?
现在想想以前为什么会出现程序异常、Memory溢出、订单撞单、明明打印的是这种结果为什么却变成了不是预期的结果...等等现象,现在终于有点思路了。
总结:ThreadPool,Cache,Log,Print...像这类的类对象只能有一个实例,如果出现多个实例就会出现上述所遇到的问题。
3.单例模式的DEMO
[b]a.最简单的写法,有一个private的构造函数,有一个生成单一实例的接口[/b]
Result:上面这种单例的实现,在多线程下运行就有可能出现两个或多个实例。
[b]b.杜绝多线程访问,保持线程同步的单例模式[/b]
可能会想到Synchronized 方法同步,确实可以做到同步,但是这样会使系统的性能大大降低,所以下面有另外一种方法可以很好的解决此问题“双重检查枷锁”
2.为什么要用Singleton?
现在想想以前为什么会出现程序异常、Memory溢出、订单撞单、明明打印的是这种结果为什么却变成了不是预期的结果...等等现象,现在终于有点思路了。
总结:ThreadPool,Cache,Log,Print...像这类的类对象只能有一个实例,如果出现多个实例就会出现上述所遇到的问题。
3.单例模式的DEMO
[b]a.最简单的写法,有一个private的构造函数,有一个生成单一实例的接口[/b]
public class Singleton{
//利用静态变量来记录唯一实例
private static Singleton uniqueSingleton;
/**
*私有构造函数
*/
private Singleton(){
}
public static Singleton getInstance(){
if(null==uniqueSingleton){
uniqueSingleton=new Singleton();
}
return uniqueSingleton;
}
}
Result:上面这种单例的实现,在多线程下运行就有可能出现两个或多个实例。
[b]b.杜绝多线程访问,保持线程同步的单例模式[/b]
可能会想到Synchronized 方法同步,确实可以做到同步,但是这样会使系统的性能大大降低,所以下面有另外一种方法可以很好的解决此问题“双重检查枷锁”
public class Singleton{
//利用静态变量来记录唯一实例 枷锁
private volatile static Singleton uniqueSingleton;
/**
*私有构造函数
*/
private Singleton(){
}
public static Singleton getInstance(){
if(null==uniqueSingleton){//第一次检查
synchronized(Singleton.class){
if(null==uniqueSingleton){//第二次检查
uniqueSingleton=new Singleton();
}
}
}
return uniqueSingleton;
}
}