1.单例模式
所谓单例模式,就是保证类在内存中只有一个对象。如何保证内存中只有一个对象呢,
就需要私有化构造器,私有化new 对象的方法,然后提供一个公共方法来访问该单例类。
1.1 饿汉式:类加载的时候先new好对象
从上面代码我们可以看出该方式在成员位置声明singleton类型的静态变量,并没有进行对象的赋值操作,
那什么时候赋值的呢?当调用getInstance()方法获取singleton类的对象的时候才创建singleton类的对象,
这样就实现了懒加载的效果。但如果是多线程环境,会出现线程安全问题。可以在如下位置加锁
懒汉式双重检查锁:
再来讨论一下懒汉模式中加锁的问题,对于 getInstance()方法来说,绝大部分的操作都是读操作,读操作是线程安全的,所以
我们没必让每个线程必须持有锁才能调用该方法,我们可以调整加锁的时机。由此也产生了一种新的实现模式:双重检查锁模式。
双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其
实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是Jv在实例化对象的时候会进行优化和指令重排序
操作。要解决双重检查锁模式带来空指针异常的问题,只需要使用 volatile关键字, volatile关键字可以保证可见性和有序性
序列化破坏单例:参考:https://blog.csdn.net/leo187/article/details/104332138
Objectinputstream底层有一个readOrdinaryObject方法有调用hasReadResolveMethod的判断,这个方法是验证目标类是否包含一个方法名为readResolve的方法,
如果有就执行desc.invokeReadResolve,即我们在单例创建的readResolve方法,并将获得的对象返回,如果没有就通过newInstance()方法反射实例化一个新的对象,
那样就会是两个新对象了,单例就被破坏。
标签:加锁,对象,模式,线程,单例,方法 From: https://www.cnblogs.com/yellowhl/p/18395427