(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值