/**
* 单例模式
*/
public class SingleInstance {
private String name;
private static SingleInstance si=null;
private static Object syncObj=new Object();
/**
* 私有化构造函数,外界不能用new新建此实例
*/
private SingleInstance(){
}
/**
* 非线程安全的获取实例方法
*/
public static SingleInstance getNonThreadSafeInstance(){
if(si==null){
si=new SingleInstance();
}
return si;
}
/**
* 线程安全的获取实例方法:简单进行加锁对效率会有一定影响
*/
public static SingleInstance getThreadSafeInstance(){
synchronized(syncObj){
if(si==null){
si=new SingleInstance();
}
}
return si;
}
/**
* 线程安全的双重锁定获取实例方法:增加外层if判断增强多线程效率
*/
public static SingleInstance getThreadSafeDblLockInstance(){
if(si==null){
synchronized(syncObj){
if(si==null){
si=new SingleInstance();
}
}
}
return si;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 模拟客户端
*/
public static void main(String[] args) {
SingleInstance nonThreadSafeSi1=SingleInstance.getNonThreadSafeInstance();
nonThreadSafeSi1.setName("非线程安全单例1");
System.out.println(nonThreadSafeSi1.getName());
SingleInstance nonThreadSafeSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(nonThreadSafeSi2.getName());
System.out.println();
SingleInstance threadSafeSi1=SingleInstance.getNonThreadSafeInstance();
threadSafeSi1.setName("线程安全单例1");
System.out.println(threadSafeSi1.getName());
SingleInstance threadSafeSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(threadSafeSi2.getName());
System.out.println();
SingleInstance threadSafeDblLockSi1=SingleInstance.getNonThreadSafeInstance();
threadSafeDblLockSi1.setName("线程安全双重锁定单例1");
System.out.println(threadSafeDblLockSi1.getName());
SingleInstance threadSafeDblLockSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(threadSafeDblLockSi2.getName());
System.out.println();
}
}
/*
运行结果
非线程安全单例1
非线程安全单例1
线程安全单例1
线程安全单例1
线程安全双重锁定单例1
线程安全双重锁定单例1
*/
* 单例模式
*/
public class SingleInstance {
private String name;
private static SingleInstance si=null;
private static Object syncObj=new Object();
/**
* 私有化构造函数,外界不能用new新建此实例
*/
private SingleInstance(){
}
/**
* 非线程安全的获取实例方法
*/
public static SingleInstance getNonThreadSafeInstance(){
if(si==null){
si=new SingleInstance();
}
return si;
}
/**
* 线程安全的获取实例方法:简单进行加锁对效率会有一定影响
*/
public static SingleInstance getThreadSafeInstance(){
synchronized(syncObj){
if(si==null){
si=new SingleInstance();
}
}
return si;
}
/**
* 线程安全的双重锁定获取实例方法:增加外层if判断增强多线程效率
*/
public static SingleInstance getThreadSafeDblLockInstance(){
if(si==null){
synchronized(syncObj){
if(si==null){
si=new SingleInstance();
}
}
}
return si;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 模拟客户端
*/
public static void main(String[] args) {
SingleInstance nonThreadSafeSi1=SingleInstance.getNonThreadSafeInstance();
nonThreadSafeSi1.setName("非线程安全单例1");
System.out.println(nonThreadSafeSi1.getName());
SingleInstance nonThreadSafeSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(nonThreadSafeSi2.getName());
System.out.println();
SingleInstance threadSafeSi1=SingleInstance.getNonThreadSafeInstance();
threadSafeSi1.setName("线程安全单例1");
System.out.println(threadSafeSi1.getName());
SingleInstance threadSafeSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(threadSafeSi2.getName());
System.out.println();
SingleInstance threadSafeDblLockSi1=SingleInstance.getNonThreadSafeInstance();
threadSafeDblLockSi1.setName("线程安全双重锁定单例1");
System.out.println(threadSafeDblLockSi1.getName());
SingleInstance threadSafeDblLockSi2=SingleInstance.getNonThreadSafeInstance();
System.out.println(threadSafeDblLockSi2.getName());
System.out.println();
}
}
/*
运行结果
非线程安全单例1
非线程安全单例1
线程安全单例1
线程安全单例1
线程安全双重锁定单例1
线程安全双重锁定单例1
*/
本文介绍单例模式的三种实现方式:非线程安全、线程安全及线程安全双重锁定。通过具体Java代码示例展示了如何确保应用中仅存在一个实例,并提供了不同场景下的效率对比。
306

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



