类加载到内存后,就实例化一个单例,JVM保证线程安全。类就加载一次。
简单使用,推荐使用。
唯一缺点:不管用到与否,类加载时就完成实例化
package com.yc.designmode.singgleton;
public class Main01 {
private Main01(){};
public static final Main01 main01= new Main01();
public static Main01 getInstance (){
return main01;
}
public static void main(String[] args) {
Main01 instance = Main01.getInstance();
Main01 instance2 = Main01.getInstance();
System.out.println(instance ==instance2);
}
}
懒汉式(线程不安全版)
package com.yc.designmode.singgleton;
import com.yc.designmode.util.ThreadUtil;
import java.util.concurrent.TimeUnit;
public class Main02 {
private static Main02 instance;
private Main02 (){};
public static Main02 getInstance(){ //线程不安全
// public synchronized static Main02 getInstance(){ //线程安全 但是效率慢
if (instance ==null){
ThreadUtil.sleep(1000);
instance=new Main02();
}
return instance;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(()->{
Main02 instance = getInstance();
System.out.println(instance.hashCode());
}).start();
}
}
}
懒汉式(线程安全版,但是效率不高)
package com.yc.designmode.singgleton;
import com.yc.designmode.util.ThreadUtil;
import java.util.concurrent.TimeUnit;
public class Main02 {
private static Main02 instance;
private Main02 (){};
public synchronized static Main02 getInstance(){ //线程安全 但是效率慢
if (instance ==null){
ThreadUtil.sleep(1000);
instance=new Main02();
}
return instance;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(()->{
Main02 instance = getInstance();
System.out.println(instance.hashCode());
}).start();
}
}
}
懒汉式(线程安全版,双重验证)
使用synchronized 虽然线程安全,但是效率不高,我们进行改进
使用双重验证的形式进行判断
package com.yc.designmode.singgleton;
import com.yc.designmode.util.ThreadUtil;
import java.util.concurrent.TimeUnit;
public class Main02 {
private static Main02 instance;
private Main02 (){};
public static Main02 getInstance(){ //线程不安全
// 改进版
if (instance ==null){// 先进行判断,没有锁.效率高,即使多线线程访问到,后面也有锁进行保证安全,
//当返回第一个实例的时候,就不满足 == null条件,直接返回
synchronized (Main02.class) {
if (instance ==null){
instance=new Main02();
}
}
}
return instance;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(()->{
Main02 instance = getInstance();
System.out.println(instance.hashCode());
}).start();
}
}
}



