Open zhiyongyu opened 4 years ago
饿汉式实现:
public class Test {
public static Test test = new Test();
public static Test getInstance(){
return test;
}
}
静态变量new 出实体。在类被初始化的时候就已经创建了。线程安全,但是如果没被使用到的时候,有点浪费资源。
懒汉式实现: 第一种(线程不安全)
public class Test {
private static Test test;
public static Test getInstance(){
if(test == null){
test = new Test();
}
return test;
}
}
调用方法的时候new 出实体。线程不安全。
第二种(使用同步锁,线程安全)
public class Test {
private static Test test;
public static synchronized Test getInstance(){
if(test == null){
test = new Test();
}
return test;
}
}
使用同步锁。在调用方法上使用同步锁,导致每次调用都会校验,影响性能。
第三种(双重锁,线程安全)
public class Test {
private static volatile Test test;
public static Test getInstance(){
if(test == null){
synchronized (Test.class){
if(test == null){
test = new Test();
}
}
}
return test;
}
}
双重锁会先判断一下对象是否存在,不存在对象再使用同步锁,就不用每次调用都去校验了。
静态内部类实现:
public class Test {
private static class TestHolder{
private static Test test = new Test();
}
public static Test getInstance(){
return TestHolder.test;
}
}
和饿汉式写法很像,只不过是在静态内部类的静态变量中new 出实体。线程安全。在调用方法的时候才会由内部类去创建对象,不浪费资源。
单例的实现有 1、懒汉式 2、饿汉式 3、静态内部类(其实也算懒汉式的一种)。 最主要就是这三种