设计模式——单例模式
程序员文章站
2024-03-23 14:21:22
...
单例模式(构造函数私有,提供一个全局的访问点):
-
单例类只能产生一个实例
-
单例类必须自己创建自己的唯一实例
-
单例类必须给所有其他对象提供这一实例
场景:一个类可以定义无数个对象,但是只能有一个实例
线程安全-->是否有竞态条件(临界区代码)
对临界区代码段进行原子操作-->加锁(互斥锁、自旋锁、读写锁等)
/**
* @ClassName TestDemo17
* @Description 单例模式
* @Author lzq
* @Date 2018/10/30 19:21
* @Version 1.0
**/
/**
* 饿汉式单例模式
*/
class MySigleTon {
private static MySigleTon mySigleTon = new MySigleTon();
private MySigleTon() {
System.out.println("MysigleTon");
}
public static MySigleTon getSigleTon() {
return mySigleTon;
}
}
/**
* 懒汉式单例模式
*/
class MySigleTon1 {
private static MySigleTon1 mySigleTon1 = null;
private static Object lock = new Object();
private MySigleTon1() {
System.out.println("MySigleTon1");
}
/**
* 可重入函数,线程安全函数
* @return
*/
public static MySigleTon1 getMySigleTon1() {
if(mySigleTon1 == null) {
synchronized (lock) {
if(mySigleTon1 == null) {
mySigleTon1 = new MySigleTon1();//双重检验锁
}
}
}
/*3、if(mySigleTon1 == null) {
synchronized (lock) {
mySigleTon1 = new MySigleTon1(); //如果有多个个线程的话,可能会有多个对象
}
}*/
/*2、synchronized (lock) {
if(mySigleTon1 == null) { 不适合单线程
mySigleTon1 = new MySigleTon1();
}
}*/
/*1、if(mySigleTon1 == null) {
mySigleTon1 = new MySigleTon1(); 非线程安全
}*/
return mySigleTon1;
}
}
/**
* 静态内部类实现单例模式,只有访问内部类才能拿到对象
*/
class MySigleTon2 {
private MySigleTon2() {
System.out.println("MySigleTon2");
}
private static class SigleTon {
private static final MySigleTon2 sigleTon = new MySigleTon2();
}
public static MySigleTon2 getSigleTon() {
return SigleTon.sigleTon;
}
}