服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - Java正确实现一个单例设计模式的示例

Java正确实现一个单例设计模式的示例

2021-06-30 14:43李灿辉 Java教程

今天小编就为大家分享一篇关于Java正确实现一个单例设计模式的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

设计模式中的单例,是最常用,也算是比较简单的一个了。我们都知道,要想保证只有一个实例,通常采用加锁和双重检查的方式来实现单例,代码如下。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class singletontest {
  private singletontest(){
  }
  private static singletontest instance;
  public static singletontest getinstance(){
    if(instance == null){
      synchronized (singletontest.class){
        if(instance == null){
          instance = new singletontest();
        }
      }
    }
    return instance;
  }
}

这种写法的要点主要有如下几个,1,私有构造函数,即不允许直接调用构造函数new一个对象。2,静态实例。3,静态获取示例的方法。首先判断instance是否为null,然后加锁,然后再判断instance是否为null,之后进行初始化。最后返回示例。

做到这些就足够了吗?并不是。

我们都知道,jvm的内存模型,jvm中的线程有自己的工作内存,jvm有主内存,工作内存是主内存的拷贝,工作内存和主内存直接并不是实时一致的。一个线程创建了单例对象后,别的线程并不一定可以立刻感知到。所以,以上代码中,instance还需要用volatile来修饰,才能真正做到单例模式。修改后的代码如下。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class singletontest {
  private singletontest(){
  }
  private static volatile singletontest instance;
  public static singletontest getinstance(){
    if(instance == null){
      synchronized (singletontest.class){
        if(instance == null){
          instance = new singletontest();
        }
      }
    }
    return instance;
  }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接

原文链接:https://blog.csdn.net/li_canhui/article/details/85088690

延伸 · 阅读

精彩推荐