1、什么式单例模式?
单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例) 来自于《百度百科》
2、单例模式的分类?
- 饿汉单例模式
- 懒汉单例模式
3、饿汉单例模式:
class Bank
{
/**
* 私有化构造器
*/
private Bank(){}
/**
* 定义静态变量,存放该对象。
*/
private static Bank instance=new Bank();
/**
* 返回对象的方法
*/
public static Bank createInstance()
{
return instance;
}
}
优点:线程安全。
不足:对象加载时间过长。因为静态对象是在类加载的时候进行加载,所以在占用内存的时间较长。
4、懒汉单例模式:
懒汉单例:线程不安全
class Bank
{
/**
* 私有化构造器
*/
private Bank(){}
/**
* 定义静态变量,存放该对象。
*/
private static Bank instance=null;
/**
* 返回对象的方法
*/
public static Bank createInstance()
{
if(instance==null)
{
instance=new Bank();
}
return instance;
}
}
优点:延迟对象的创建,需要该对象的时候,在进行加载,可以降低内存空间的浪费。
不足:延迟对象的创建,如果有多个线程,同时调用createInstance()方法,则会创建出多个单例对象。
懒汉同步锁:线程安全
class Bank
{
/**
* 私有化构造器
*/
private Bank(){}
/**
* 定义静态变量,存放该对象。
*/
private static Bank instance=null;
/**
* 返回对象的方法
*/
public static Bank createInstance()
{
synchronized ( Bank .class)
{
if (instance==null)
{
instance=new Bank();
}
return instance;
}
}
}
优点:
1、延迟对象的创建,不会过多的占用内存。
2、线程安全,因为针对createInstance()是单线程的。
不足:
效率较低,因为创建好对象以后,该方法仍然相当于是单线程的。
双重校验锁:线程安全,且效率较高
class Bank
{
/**
* 私有化构造器
*/
private Bank(){}
/**
* 定义静态变量,存放该对象。
*/
private static Bank instance=null;
/**
* 返回对象的方法
*/
public static Bank createInstance()
{
if(instance ==null)
{
synchronized (Bank.class)
{
if (instance==null)
{
instance=new Bank();
}
}
}
return instance;
}
}
这种方式相比较于懒汉同步锁而言,它效率更高一些。
原因:
因为第一次时,对象并没有创建,所以需要单线程,来防止生成多个单线程对象,但是一旦对象实例化完成,该方法做单线程也没有意义。所以代码先进行判断,查看是否实例化,如果实例化完,就直接返回。
如果您还是看不懂,那么请继续看下面的例子。
例如:
刚出苹果手机的时候,门店里面就仅仅只有一台苹果手机,所以此时,第一个人从前门进去,买完手机,然后从后门出去,此时第二个人进来的时候,手机已经没有了,第三个人进来的时候,也是如此。所以就考虑让他们同时进来,从而提高效率
感谢您的阅读。。。