package SingleInstanceModel;
import java.net.Socket;
import java.sql.Connection;
/**
* Created by JYM on 2019/1/8
* 单例模式:Volatile+Double-Check
* Double-Check虽然是一种巧妙的程序设计,但是有可能会引起类成员变量的实例化connection和socket发生在instance实例化之后,
* 这一切均是由于JVM在运行时指令重排序所导致的,而volatile关键字则可以防止这种重排序的繁盛,因此代码稍作修改即可满足多线程
* 下的单例、懒加载以及获取实例的高效性。
* */
//final不允许被继承
public final class Singleton_3_Volatile
{
//实例变量
private byte[] data = new byte[1024];
private volatile static Singleton_3_Volatile instance = null;
Connection connection;
Socket socket;
private Singleton_3_Volatile()
{
this.connection //初始化connection
this.socket //初始化socket
}
public static Singleton_3_Volatile getInstance()
{
//当instance为null时,进入同步代码块,同时该判断避免了每次都需要进入同步代码块,可以提高效率
if (null == instance)
{
//只有一个线程能够获得Singleton.class关联的monitor
synchronized (Singleton_3.class)
{
//判断如果instance为null则创建
if (null==instance)
{
instance = new Singleton_3_Volatile();
}
}
}
return instance;
}
}
单例设计模式的设计——Volatile+Double-Check
最新推荐文章于 2024-12-07 00:01:09 发布
本文探讨了在Java中使用Volatile关键字和Double-Check锁定来实现线程安全的单例模式。通过分析JVM指令重排序的问题,说明了Volatile如何确保连接和套接字实例化在单例实例之前完成,从而在多线程环境下提供高效的单例模式实现。
1000

被折叠的 条评论
为什么被折叠?



