您的位置:首页 > 其它

单例模式如何实现线程安全

2018-04-04 00:00 363 查看
摘要: 线程安全下的单例模式

单例模式是为确保一个类只有一个实例,并为整个系统提供一个全局访问点的一种模式方法。那我们如何在多线程下保证单例模式的线程安全呢?博主总结有以下几种方法:

1.饿汉式的单例模式

单例类如下,饿汉式就是在调用getSingle()方法前,就已经创建了一个Single对象。如下图:



线程类如下:



执行结果如下:



从运行结果我们可以看出,在5个线程都去调用单例对象时,输出的hash值是同一个,证明我们保证了线程安全。

2.饱汉式的单例模式

单例类如下,饱汉式就是在调用getSingle()方法时才创建一个Single对象。如下图:



这样的写法会导致一个问题,当两个线程同时访问这个单例类时,两个线程同时走到判断single==null这里时,都判断是没有的,就会出现问题,他们都会重新创建一个新的single对象。导致出现以下结果:



出现了不一样的hash值,所以上面的写法是无法实现线程安全的,那么怎么改进呢?

(1)在方法加上synchronized关键字

我们可以在获取单例对象的方法加上synchronized关键字。如下:



(2)静态代码块加锁

也可以采用静态代码块加锁会出现问题的地方,由于同一个对象中的所有同步方法同一时间只能有其中一个可以在一个线程中执行,加入synchronized关键字后,同步会影响程序运行效率,所以synchronized包裹的代码越少越好。如下图:



(3)采用双重锁机制

未完,待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息