码迷,mamicode.com
首页 > 其他好文 > 详细

关于单利模式的几种实现方式

时间:2019-05-29 14:52:06      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:==   常见   生活   bsp   on()   多例   对象   实例化   校验   

单例模式是java中非常常见的一种设计模式,也是java学习中很热门的一个知识模块,今天就和大家一起来了解一下单例模式和单例模式的几种实现方式。

    单例模式的定义:

    单例模式是指某个类只有一个实例,并且可以向整个系统提供这个可以自行实例化的实例。单例模式的特点是:只有一个实例、必须自己创建这个实例、必须给其他所有对象提供这个实例。单例模式,是为了确保全局对象的唯一性。

    话不多说,接下来就看一下几种实现方式:

1、饿汉式

public class Singleton{
private Singleton(){}
private static Singleton single = new Singleton();
public static Singleton getInstance(){
return single;
}
}

 


饿汉式在类初始化时就创建了一个静态对象可以被外部访问,这个对象不会被改变,所以是线程安全的;

2、懒汉式

public class Singleton{
private Singleton(){}
private static Singleton single = null;
public static Singleton getInstance(){
if(single == null){
single = new Singleton();
}
return single;
}
}

 


单线程环境下没有什么问题,但是在多线程时,会产生多个single对象,所以不是线程安全的;此时,我们可以通过synchronized同步锁来解决这个问题,如下:

public class Singleton{
private Singleton(){}
private static Singleton single = null;
public static Singleton getInstance(){
synchronized(Singleton.class){
if(single == null){
single = new Singleton();
}
return single;
}
}
}

 


通过加锁,保证了只有一个实例对象,但是,带来的问题就是:效率低下,因为下一个线程如果想要获取对象,就要等待上一个线程把锁释放掉才可以继续运行;这时,可以通过双重校验锁来优化,提高效率,代码如下:

public class Singleton{
private Singleton(){}
private static Singleton single = null;
public static Singleton getInstance(){
if(single == null){
synchronized(Singleton.class){
if(single == null){
single = new Singleton();
}
}
}
return single;
}
}

 


3、静态内部类实现

public class Singleton{
private Singleton(){}
private static class InnerObject(){
private static Singleton single = new Singleton();
}
public static Singleton getInstance(){
return InnerObject.single;
}
}

 


静态内部类是线程安全的,但是,如果遇到序列化对象,那么,就是多例的了。

4、静态代码块实现

public class Singleton{
private Singleton(){}
private static Singleton single = null;
static{
single = new Singleton();
}
public static Singleton getInstance(){
return single;
}
}

 


5、内部枚举类实现

public class SingletonEnum(){
private enum EnumSingleton{
Singleton;
private Singleton single;
private EnumSingleton(){
single = new Singleton();
}
public Singleton getInstance(){
return single;
}
}
public static Singleton getInstance(){
return EnumSingleton.Singleton.getInstance();
}
}
class Singleton(){
public Singleton(){}
}

 


以上就是单例模式的几种实现方式,希望大家可以通多代码,对单例模式有一定的了解,更深入的去了解的话,还需要自己更多的努力。不管是在以后的学习还是工作中,都是有不小的用处的。

生活不易,请你努力。

关于单利模式的几种实现方式

标签:==   常见   生活   bsp   on()   多例   对象   实例化   校验   

原文地址:https://www.cnblogs.com/junehozhao/p/10943220.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!