(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开发)关于懒汉模式的并发问题以及规避方法的主要内容,如果未能解决你的问题,请参考以下文章
关于我想知道懒汉模式 为什么要使用volatile关键字这回事
关于我想知道懒汉模式 为什么要使用volatile关键字这回事