什么是Singleton?
Singleton:在Java中既指单例设计模式,它是软件开发中常用的设计模式之一。
需求:要求当前程序只能有一个实例对象被获取或使用的代码模式。
实现:
- 一是某个类只能有一个实例; ♥ 私有构造器:不允许外界实例化
- 二是必须自行创建这个实例; ♥ 私有静态属性:给公有静态方法提供一个内部实例对象
- 三是必须自行向整个系统提供这个实例; ♥ 公有静态方法:可以在外界通过类名调用该方法,并且获得一个实例; 获取该例对象的方法(1)直接暴露 (2)用静态变量的get方法获取
几种常见的方式:
- 饿汉式:直接创建对象,多线程下,饿汉式线程安全,不用去考虑
直接实例化饿汉式(简洁直观)
枚举式(最简洁)
静态代码块饿汉式(适合复杂实例化)
- 懒汉式:延迟创建对象。多线程下,懒汉式线程不安全;(添加同步锁实现同步-线程安全)
直接实例,简单的demo,例如:
import java.util.HashSet;
import java.util.Set;
public class Singleton {
static Set<SingleTon1> set1 = new HashSet<SingleTon1>();
static Set<SingleTon2> set2 = new HashSet<SingleTon2>();
static Runnable r1=new Runnable() {
@Override
public void run() {
SingleTon1 dl=SingleTon1.getSingleTon1();
set1.add(dl);
}
};
static Runnable r2=new Runnable() {
@Override
public void run() {
SingleTon2 dl2=SingleTon2.getSingleTon2();
set2.add(dl2);
}
};
public static void main(String[] args) {
for(int i=1;i<=10;i++) {
Thread t = new Thread(r2);
t.start();
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(set2.size());
}
}
//饿汉式
class SingleTon1{
//私有构造器,防止外界直接实例
private SingleTon1() {}
//公有静态方法,
public static SingleTon1 getSingleTon1() {
return st1;
}
//私有静态属性;
private static SingleTon1 st1=new SingleTon1();
}
//懒汉式
class SingleTon2{
//私有构造器,防止外界直接实例
private SingleTon2() {}
//公有静态方法,
public static synchronized SingleTon2 getSingleTon2() {
if(st2==null) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
st2=new SingleTon2();
}
return st2;
}
//私有静态属性;
private static SingleTon2 st2;
}
单例设计模式的证明