单例模式
概念理解:程序内只存在一个该对象。
分类:
1.饿汉模式:在程序启动时创建。只创建一次。线程安全。
2.懒汉模式:用到时再创建。只创建一次。线程不安全。
懒汉为什么线程不安全?
当多个线程同时执行获取单例对象的方法时(如下面代码:getLazySingle()),会出现创建多个单例对象的情况。
具体请可以参照:https://blog.csdn.net/luqiren/article/details/79065545
代码演示:
1.饿汉模式:
/*
* 饿汉模式:程序一开始启动就创建
*/
public class HungerSingle {
//构造私有:防止在本类外部创建对象
private HungerSingle (){
System.out.println("我是一名饥饿的痴汉,主动去勾搭!!!");
}
//内部创建当前对象
private static HungerSingle instance = new HungerSingle();
//外部获取当前单例对象的方法
public static HungerSingle getHungerSingle(){
return instance;
}
}
* 饿汉模式:程序一开始启动就创建
*/
public class HungerSingle {
//构造私有:防止在本类外部创建对象
private HungerSingle (){
System.out.println("我是一名饥饿的痴汉,主动去勾搭!!!");
}
//内部创建当前对象
private static HungerSingle instance = new HungerSingle();
//外部获取当前单例对象的方法
public static HungerSingle getHungerSingle(){
return instance;
}
}
=================================================================
2.懒汉模式
/*
* 懒汉模式:用到我,我再去创建
*/
public class LazySingle {
// 构造私有:防止在本类外部创建对象
private LazySingle() {
System.out.println("我是一名懒散的痴汉,等着被勾搭!!!");
};
// 这里只是被声明,并未创建对象
private static LazySingle instance;
//当该方法被“第一次”调用时创建单例对象,只是第一次调用时创建
public static LazySingle getLazySingle() {
//第一次调用,创建对象
if(instance == null){
instance = new LazySingle();
}
return instance;
}
}
=================================================================
* 懒汉模式:用到我,我再去创建
*/
public class LazySingle {
// 构造私有:防止在本类外部创建对象
private LazySingle() {
System.out.println("我是一名懒散的痴汉,等着被勾搭!!!");
};
// 这里只是被声明,并未创建对象
private static LazySingle instance;
//当该方法被“第一次”调用时创建单例对象,只是第一次调用时创建
public static LazySingle getLazySingle() {
//第一次调用,创建对象
if(instance == null){
instance = new LazySingle();
}
return instance;
}
}
=================================================================
3.测试
public class SingleTest {
public static void main(String[] args) {
// 饿汉单例测试
/*HungerSingle single01 = HungerSingle.getHungerSingle();
HungerSingle single02 = HungerSingle.getHungerSingle();
if (single01 == single02) {
System.out.println("同一个痴汉!!!");
}else {
System.out.println("两个痴汉!!!");
}*/
//懒汉测试
LazySingle single01 = LazySingle.getLazySingle();
LazySingle single02 = LazySingle.getLazySingle();
if (single01 == single02) {
System.out.println("同一个痴汉!!!");
}else {
System.out.println("两个痴汉!!!");
}
}
}
=================================================================
public static void main(String[] args) {
// 饿汉单例测试
/*HungerSingle single01 = HungerSingle.getHungerSingle();
HungerSingle single02 = HungerSingle.getHungerSingle();
if (single01 == single02) {
System.out.println("同一个痴汉!!!");
}else {
System.out.println("两个痴汉!!!");
}*/
//懒汉测试
LazySingle single01 = LazySingle.getLazySingle();
LazySingle single02 = LazySingle.getLazySingle();
if (single01 == single02) {
System.out.println("同一个痴汉!!!");
}else {
System.out.println("两个痴汉!!!");
}
}
}
=================================================================