文章目录
1.饿汉式(线程安全)
1.1饿汉式直接实例
package test;
/**
* 饿汉式
* 直接创建对象
* 1.构造器私有化
* 2.自行创建,并用静态变量保存
* 3.向外提供这个实例
* 4.强调这是一个实例,用final修饰
*/
public class SingletonTest {
public static final SingletonTest INSTANCE = new SingletonTest();
private SingletonTest(){
}
public static void test(){
//如果是为了调用静态方法而创建对象,则无需创建实例对象
//但饿汉式无论需不需要都会创建实例
}
}
获取实例
public class TestSingleton1 {
public static void main(String[] args) {
SingletonTest1 s = SingletonTest1.INSTANCE;
System.out.println(s);//test.SingletonTest1@4769b07b
}
}
饿汉式:直接创建对象
- 1.构造器私有化
- 2.自行创建,并用静态变量保存
- 3.向外提供这个实例
- 4.强调这是一个实例,用final修饰
缺点
- 如果是为了调用静态方法而创建对象,则无需创建实例对象
- 但饿汉式无论需不需要都会创建实例
1.2饿汉式枚举式
public enum SingletonTest2 {
INSTANCE
}
获取实例
public class TestSingleton2 {
public static void main(String[] args) {
SingletonTest2 s = SingletonTest2.INSTANCE;
System.out.println(s);//INSTANCE
}
}
1.3饿汉式静态代码块(线程安全)
类初始化方法
<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,是线程安全的
虚拟机会保证一个类的类构造器clinit()在多线程环境中被正确的加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的类构造器clinit(),其他线程都需要阻塞等待,直到活动线程执行clini()方法完毕。
public class SingletonTest3 {
public static final SingletonTest3 INSTANCE;
private String info;
static{
INSTANCE = new SingletonTest3("hello");
}
private Si