package singletonModel;
//1.懒汉式单例模式
/**
* 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
* 单例模式可以保证内存里只有一个实例,减少了内存的开销。
* 扩展需要修改原代码,违背开闭原则。
*/
public class Single {
private static Single single=null; //设置为静态私有的,只能自己调用
private Single(){ //创建私有的构造方法,自己调用
}
// 定义静态的方法,返回唯一的实例对象
public static Single getInstance(){
if(single==null){
single=new Single();
}
return single;
}
}
//客户端测试
public class Client {
public static void main(String[] args) {
for(int i=0;i<10;i++) { //开启10个线程查看情况,发现其中的对象进行变化了
new Thread(()->{
Single single = Single.getInstance();
System.out.println(single);
}).start();
}
}
运行之后的结果:
发现实例不唯一了,所以我们需要给这个加锁,让其在一个进程内只能存在一个线程来创建对象,让线程同步。
package singletonModel;
//懒汉式单例模式
/**
* 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
* 单例模式可以保证内存里只有一个实例,减少了内存的开销。
* 扩展需要修改原代码,违背开闭原则。
*/
public class Single {
private static volatile Single single=null; //volatile保证 single 在所有线程中同步
private Single(){ //创建私有的构造方法,自己调用
}
// 定义静态的方法,返回唯一的实例对象,synchronized实现getInstance方法同步。
public static synchronized Single getInstance(){
if(single==null){
single=new Single();
}
return single;
}
}
运行截图:
解决,但是这个创建还是比较耗资源的
2.饿汉使单例模式
package singletonModel;
//模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了
public class Single1 {
private final static Single1 single=new Single1();
private Single1() {
}
public static Single1 getInstance() {
return single;
}
}