写一下单例模式,考虑线程安全与线程不安全的情况
2015-04-22 00:36
246 查看
凡是提到设计模式,面试官很喜欢问最简单的单例模式。
这个写法是饿汉单例模式,但也是是属于线程不安全的写法。如果多线程同时来进行getInstance的操作,那么这个时候进入if(instance == null)判断时就需要加入线程同步的方法了。
这个方法可以保证线程的同步,但是效率太低,因为大多数情况下不需要同步
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊。1
方法一
单例模式最简单的写法如下public class SingletonPatternA { private static SingletonPatternA instance = null; private SingletonPatternA(){} public static SingletonPatternA getInstance(){ if(instance == null) instance = new SingletonPatternA(); return instance; } }
这个写法是饿汉单例模式,但也是是属于线程不安全的写法。如果多线程同时来进行getInstance的操作,那么这个时候进入if(instance == null)判断时就需要加入线程同步的方法了。
方法二
下面写一写存在线程安全的单例模式。/** * 单例模式 - 懒汉、线程安全 */ public class SingletonPatternB { private static SingletonPatternB instance; private SingletonPatternB() { } // 加入synchronized,把整个方法串行执行 public static synchronized SingletonPatternB getInstance(){ if(instance == null){ instance = new SingletonPatternB(); } return instance; } }
这个方法可以保证线程的同步,但是效率太低,因为大多数情况下不需要同步
方法三
上述两种方法都是懒汉单例模式,但是处理线程同步还是存有一些问题,所以参考了多种线程安全的单例模式后,我觉得下面这种比较好理解。/** * enum 是JDK1.5后出来的 */ public enum SingletonPatternC { INSTANCE; public void PrintFunction(){ System.out.println("This is Enum Type"); }; public static void main(String[] args) { SingletonPatternC ins = SingletonPatternC.INSTANCE; ins.PrintFunction(); } } ------- This is Enum Type
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊。1
方法四
饿汉式单例模式,本身是一种线程安全的方法,再类创建的时候,对象就生成了,所以不存在线程同步的问题。2/** * 饿汉式单例模式 */ public class SingletonPatternD { private static SingletonPatternD instance = new SingletonPatternD(); private SingletonPatternD(){ } public SingletonPatternD getInstance(){ return instance; } }
相关文章推荐
- 设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题
- C++ 单例模式,考虑线程安全和性能的几种方式
- 线程安全单例设计模式+序列化
- 线程安全的单例模式
- Java之线程安全的单例设计模式
- 线程不安全的懒汉式为何不是严格的单例模式
- 【转】线程安全的单例模式
- Java线程安全单例模式实现
- 线程安全的单例模式也可以很精彩
- 单例模式中的线程安全问题
- C++的单例模式与线程安全单例模式(懒汉/饿汉)
- 线程安全的单例模式 的各种实现 总结
- 互联网研发模式考虑(感觉不错,mark一下)
- C++的单例模式与线程安全单例模式(懒汉/饿汉)
- Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。
- java 线程-生命周期-锁-阻塞-生成消费模式-安全容器
- boost中asio网络库多线程并发处理实现,以及asio在多线程模型中线程的调度情况和线程安全。
- C++ 实现的线程安全的单例模式类
- 线程安全的单例模式
- 单例模式与线程安全问题浅析