单例设计模式的回顾。。。。
一、摘要
在我们开发、或者查看源码的过程中,或多或少都会接触到一些设计模式,现在回顾的是最简单的单例设计模式
所谓单例设计模式指的就是在程序中我们指定的类的对象只有一个。
在单例设计模式中主要分两种:懒汉式以及恶汉式
恶汉式:没有线程安全问题
懒汉式:存在线程安全问题,但可以使用同步代码块进行加锁保证
二、在单线程情况下的恶汉式以及懒汉式代码案例:
public class SimpleDemo1 {
/**
* 恶汉式
*/
private static SimpleDemo1 sd=new SimpleDemo1();//在多线程情况安全,但不建议这么做,浪费内存
private SimpleDemo1(){}
public static SimpleDemo1 getInstance(){
return sd;
}
}
/**
* 懒汉式
*/
class SimpleDemo2{
private static SimpleDemo2 sd=null;
public SimpleDemo2(){}
public static SimpleDemo2 getInstance(){
if(sd ==null){ //多线程情况下这里可能会产生线程安全问题
sd= new SimpleDemo2();
}
return sd;
}
}
三、在多线程的情况下对懒汉式单例进行优化:
/**
* 多线程情况下优化懒汉式
*/
class SimpleDemo2{
private static SimpleDemo2 sd=null;
public SimpleDemo2(){}
public static SimpleDemo2 getInstance(){
synchronized (SimpleDemo2.class){ //此处线程会出现等待的情况,进一步代码优化参考下面
if(sd ==null){
sd= new SimpleDemo2();
}
return sd;
}
}
}
/**
* 多线程情况下优化懒汉式:在同步前进行一次判断,能够有效的节省了资源
*/
class SimpleDemo2{
private static SimpleDemo2 sd=null;
public SimpleDemo2(){}
public static SimpleDemo2 getInstance(){
if(sd == null){ //在此处进行判断,对对象为null才去加锁,这样效率会更高
synchronized (SimpleDemo2.class){
if(sd ==null){
sd= new SimpleDemo2();
}
}
}
return sd;
}
}
综上:在多线程的情况,需要考虑到线程的安全问题,可以采取最下面的一种方法,在同步之前最好做一次判断,节省了资源

浙公网安备 33010602011771号