经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
【设计模式】单例模式(Singleton Pattern)
来源:cnblogs  作者://没有对象的空指针  时间:2021/1/11 9:36:57  对本文有异议
  • 懒汉式
  1. public class Singleton {
  2. private static Singleton instance;
  3. private Singleton() {};
  4. public static synchronized Singleton getInstance() {
  5. if (instance == null) {
  6. instance = new Singleton();
  7. }
  8. return instance;
  9. }
  10. }

首次调用时进行初始化;
synchronized加锁保证线程安全;

  • 饿汉式
  1. public class Singleton {
  2. private static Singleton instance = new Singleton();
  3. private Singleton() {};
  4. public static Singleton getInstance() {
  5. return instance;
  6. }
  7. }

类加载时就实例化,避免了多线程同步问题,不需要加锁;

  • 双重校验锁(DCL, double checked locking)
  1. public class Singleton {
  2. private volatile static Singleton instance;
  3. private Singleton() {};
  4. public static Singleton getInstance() {
  5. if (instance == null){
  6. synchronized (Singleton.class) {
  7. if (instance == null){
  8. instance = new Singleton();
  9. }
  10. }
  11. }
  12. return instance;
  13. }
  14. }

首次调用时进行初始化;
volatile关键字保证了变量在多线程下的可见性以及防止指令重排;
通过加锁和两次校验是否实例化避免多线程多次创建实例的问题;如:
当实例未被创建时,线程t1调用getInstance方法,第一次判断instance==null为真,继续执行,进入同步代码块。在t1创建实例之前,线程t2也调用了getInstance方法,并且由于实例还未被创建,t2同样可以通过第一个if,继续往下执行。t1创建完实例后退出同步代码块,t2进入,此时,如果没有第二个if,那么t2也会创建一个实例,但是加上第二个if,就可以避免这个多线程多次创建实例的问题。

  • 静态内部类
  1. public class Singleton {
  2. private static class SingletonHolder {
  3. private static final Singleton INSTANCE = new Singleton();
  4. }
  5. private Singleton() {};
  6. public static final Singleton getInstance() {
  7. return SingletonHolder.INSTANCE;
  8. }
  9. }

利用类加载机制避免多线程同步问题;
静态内部类延迟了初始化,只有调用getInstance方法时才会加载内部类,从而实例化;

原文链接:http://www.cnblogs.com/Tessic/p/14241161.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号