Java正确实现一个单例设计模式的示例
时间:2021-03-20 10:02:15|栏目:JAVA代码|点击: 次
设计模式中的单例,是最常用,也算是比较简单的一个了。我们都知道,要想保证只有一个实例,通常采用加锁和双重检查的方式来实现单例,代码如下。
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来修饰,才能真正做到单例模式。修改后的代码如下。
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;
}
}
总结
上一篇:SpringMVC源码解读之 HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化
栏 目:JAVA代码
本文标题:Java正确实现一个单例设计模式的示例
本文地址:http://www.codeinn.net/misctech/84529.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




