(Android开发)关于懒汉模式的并发问题以及规避方法

Posted 汤姆的猫生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(Android开发)关于懒汉模式的并发问题以及规避方法相关的知识,希望对你有一定的参考价值。

        最近在学习如何开发好一个android项目。而在Android项目以及搭建通用框架的过程中,单例模式的使用是少不了的。对于单例模式,我个人的理解就是需要使用的这个类时候,只能够创建同一个对象。那在单例模式中其实又可以分为两种比较基础的模式,第一种叫做饿汉模式,第二种叫做懒汉模式。饿汉模式比较好理解,就是调用类的静态方法时,类的对象同时被创建出来(因为饿汉自己内部存在着创建对象的静态块,类加载前静态块先加载创建对象),这种方式对于内存来说无疑是一种消耗。

那接下来我们来说一下懒汉模式的构建、线程进行时该模式存在的问题以及如何解决这些问题。懒汉模式。其实就是先判断对象是否存在,存在则不新建,不存在则新建一个唯一对象。而懒汉模式,在多线程运行的过程中,可能会出现安全问题。

pool-1-thread-4:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-14:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-10:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-8:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-5:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-12:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-1:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-9:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-6:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-2:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-16:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-3:com.roocon.thread.t5.Singleton2@1c208db1
pool-1-thread-17:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-13:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-18:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-7:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-20:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-11:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-15:com.roocon.thread.t5.Singleton2@6519891a
pool-1-thread-19:com.roocon.thread.t5.Singleton2@6519891a

从上面具体运行的结果上看。我们可以发现明明为单例模式,却冒出了一个thread.t5.Singleton2@1c208db1第二个对象。这就涉及到了线程A和线程B占用CPU,导致线程同时实例化对象的问题。

解决的办法

1、 双锁+volatile

2、静态内部类实现线程安全。利用了classloader的机制来保证初始化instance时只有一个线程,所以也是线程安全的,同时没有性能损耗。

3、使用枚举类。 //相比较1方法来说,简洁方便,不需要考虑线程安全问题。因为虚拟机在加载枚举的类的时候,会使用ClassLoader的loadClass(和2有异曲同工之妙)方法,而这个方法使用同步代码块保证了线程安全。所以,创建一个enum类型是线程安全的。

参考博客:

1、双锁+volatile:https://www.cnblogs.com/sunnyDream/p/8011186.html

2、静态内部类:https://www.cnblogs.com/runningwang/p/6155039.html

3、使用枚举类:https://blog.csdn.net/moakun/article/details/80688851

以上是关于(Android开发)关于懒汉模式的并发问题以及规避方法的主要内容,如果未能解决你的问题,请参考以下文章

Java单例模式--------懒汉式和饿汉式

关于我想知道懒汉模式 为什么要使用volatile关键字这回事

关于我想知道懒汉模式 为什么要使用volatile关键字这回事

关于我想知道懒汉模式 为什么要使用volatile关键字这回事

Android 深入理解单例模式

单例模式中的懒汉式以及线程安全性问题