单例模式真的是单例吗?
程序员文章站
2024-03-21 17:03:04
...
我们知道单例模式分为饿汉模式(直接创建对象)和懒汉模式(延迟加载)
单例模式-懒汉模式在并发的情况下,会导致创建出多个对象的情况。
如下图所示,单例模式-懒汉模式创建了两个实例
下面是代码
package com.design.mode.single;
/**
* @description:
* @author: HYW
* @create: 2020-01-03 08:45
*/
public class Single {
private static Single single;
private Single(){};
public static Single getInstance(){
if(single == null){
single=new Single();
}
return single;
}
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试类
package com.design.mode.single;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @description:
* @author: HYW
* @create: 2020-01-03 08:48
*/
public class Demo {
public static void main(String[] args) {
ThreadPoolExecutor pool=new ThreadPoolExecutor(10,20,1000,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(20));
for(int i=0;i<15;i++) {
pool.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Single single=Single.getInstance();
System.out.println(single);
}
});
System.out.println("线程池中线程数目:"+pool.getPoolSize()+",队列中等待执行的任务数目:"+
pool.getQueue().size()+",已执行玩别的任务数目:"+pool.getCompletedTaskCount());
}
pool.shutdown();
}
}
问题原因,如果第一次创建实例时,多个线程同时执行任务,就会导致这段代码被多次执行
if(single == null){
single=new Single();
}
解决方式
1.双重锁 volatile + synchronized
volatile private static Single single;
private Single(){};
synchronized public static Single getInstance(){
if(single == null){
single=new Single();
}
return single;
}
2.饿汉模式
private static Single single=new Single();
这样保证了类加载时创建一次
上一篇: MySQL提示“too many connections“的解决方法
下一篇: 阿里云扩容云盘
推荐阅读
-
单例模式真的是单例吗?
-
Python单例模式的4种实现方法 博客分类: Pytho2.xPython2.7GhostFromHeaven python2.xpython2.7pythonGhostFromHeaven单例
-
单例设计模式 - 懒汉式和饿汉式
-
java的单例模式
-
Java 设计模式之路《三》单例模式 博客分类: 设计模式
-
被面试官虐过之后,他轻蔑的问我:你还说你了解单例模式吗?
-
Java双重检测锁的单例模式最全详解
-
单例模式 博客分类: Java设计模式 Java设计模式
-
设计模式之单例模式三(更好的实现方式) 博客分类: 设计模式 设计模式单例模式
-
设计模式之单例模式三(更好的实现方式) 博客分类: 设计模式 设计模式单例模式