多线程的单例模式

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;
     }
 }

这种方式相比较于懒汉同步锁而言,它效率更高一些。
原因:

因为第一次时,对象并没有创建,所以需要单线程,来防止生成多个单线程对象,但是一旦对象实例化完成,该方法做单线程也没有意义。所以代码先进行判断,查看是否实例化,如果实例化完,就直接返回。

如果您还是看不懂,那么请继续看下面的例子。
例如:

刚出苹果手机的时候,门店里面就仅仅只有一台苹果手机,所以此时,第一个人从前门进去,买完手机,然后从后门出去,此时第二个人进来的时候,手机已经没有了,第三个人进来的时候,也是如此。所以就考虑让他们同时进来,从而提高效率

小编能力优先,如有问题,请您提出宝贵建议。
原创文章 86 获赞 50 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qizhi666/article/details/104030490