在看单例模式的代码时,发现单例模式有一种实现方法中出现了volatile 关键字,这里就有了疑问:
为什么要使用volatile关键字??
volatile关键字与多线程中的双重检查有什么关系??
volatile与synchronized有什么关系???
单例模式的八种实现代码,参考以下博文:
链接:https://www.cnblogs.com/zhaoyan001/p/6365064.html
标题:单例模式的八种写法比较
注:单例模式常常与工厂模式结合使用,因为工厂只需要创建产品实例就可以了,在多线程中也不会产生冲突,因此只需要一个工厂实例就可以。
单例模式优点:减少了时间和空间的开销(new实例的开销);
提高了封装性,外部不易改动实例。
volatile 的参考博文:
1 链接:https://blog.youkuaiyun.com/u012723673/article/details/80682208 (volatile关键字的最全总结)
2 链接:https://www.cnblogs.com/daxin/p/3364014.html
3 链接: https://www.cnblogs.com/zhengbin/p/5654805.html
4 重排序相关博文:https://blog.youkuaiyun.com/lyt_7cs1dn9/article/details/73285957
https://blog.youkuaiyun.com/wpb92/article/details/76714329(多线程下双重检查锁的问题及解决方法)
5 链接:https://blog.youkuaiyun.com/dawanganban/article/details/39275863
6 链接:http://www.360doc.com/content/18/0120/15/20874412_723630367.shtml
需要理解的概念:Java内存模型的 可见性、原子性和有序性、volatile的底层原理以及volatile的读写性能消耗、计算机内存和缓存的区别。
总之,记住volatile解决了变量的可见性和有序性,并不能解决原子性,并且有序性一般是在多线程中出现的问题,在单线程中不会出现有序性的问题,及时出现重排序也不会影响程序运行结果。。