作者:-啊-亮---_252_980 | 来源:互联网 | 2023-09-09 17:55
单例模式有以下特点:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。通常单例模式会这样写:packagecn.com.test.
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
通常单例模式会这样写:
package cn.com.test.p201612.test3;
public class MemcachedUtil {
private static MemcachedUtil instance = null;
/**
* 构造方法私有化
*/
private MemcachedUtil(){
}
/**
* 对外提供实例的方法
* @return
*/
public static MemcachedUtil getInstance() {
if(instance == null){
instance=new MemcachedUtil();
}
return instance;
}
}
如果是单线程环境下,以上实例是没有问题,如果是多线程环境下,会有什么问题呢?
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
ExecutorService es = Executors.newCachedThreadPool();
for(int i = 0;i<100;i++){
es.execute(new Runnable(){
@Override
public void run() {
MemcachedUtil m = MemcachedUtil.getInstance();
System.out.println(m.hashCode()+" - "+m.toString());
}
});
}
}
}
运行一下main()方法,运行结果(每次运行结果是不一样的哦):
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1778858866 - cn.com.test.p201612.test3.MemcachedUtil@6a073b72
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
1776280659 - cn.com.test.p201612.test3.MemcachedUtil@69dfe453
从中可以看到,在多线程环境下,通过单例实例获取到的实例不是唯一的,那怎么解决呢?
package cn.com.test.p201612.test2;
public class MemcachedUtil {
private static MemcachedUtil instance = null;
/**
* 构造方法私有化
*/
private MemcachedUtil(){
}
/**
* 改用嵌套类静态实始化
* @return
*/
public static MemcachedUtil getInstance() {
if(instance == null){
synchronized(MemcachedUtil.class) {
if (instance==null) {
instance=new MemcachedUtil();
}
}
}
return instance;
}
}
改造后的单例模式,添加了synchronized关键字,通过锁机制可以实现高并发下的唯一性!