单例模式---> 懒汉式
public class Student {
private static Student instance = null;
private Student() {}
/**
* 双重检索方式(效率最高)
*
* Thread-1---->com.online.taxi.order.service.impl.Student@22047bda
* Thread-0---->com.online.taxi.order.service.impl.Student@22047bda
*/对象相同
private static Student getInstance(){
//如果第一个线程过来发现Student对象为null,则进入同步方法
//如果第二个线程过来发现对象已经存在则不会在进入同步方法,而是直接获取已经存在的对象
if(instance == null){
synchronized (Student.class) {
if(instance == null){
instance = new Student();
}
}
}
return instance;
}
/**
*方法上添加同步关键字
* Thread-1---->com.online.taxi.order.service.impl.Student@5a2cdcfd
* Thread-0---->com.online.taxi.order.service.impl.Student@5a2cdcfd
对象相同
* @return
*/
private static synchronized Student getInstance2(){
if(instance == null){
instance = new Student();
}
return instance;
}
/**
* 代码块锁定范围太大,每次获取对象都要经过同步方法
*
* Thread-0---->com.online.taxi.order.service.impl.Student@692db0ef
* Thread-1---->com.online.taxi.order.service.impl.Student@692db0ef
对象相同
* @return
*/
private static Student getInstance3(){
synchronized (Student.class) {
if(instance == null){
instance = new Student();
}
}
return instance;
}
/**
* 不安全的单例模式(懒汉式)
*
* Thread-0---->com.online.taxi.order.service.impl.Student@5a2cdcfd
* Thread-1---->com.online.taxi.order.service.impl.Student@568b35d7
对象不相同
* @return
*/
private static Student getInstance4(){
if (instance == null){
instance = new Student();
}
return instance;
}
static class SyncStudent extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"---->" + Student.getInstance4());
}
}
public static void main(String[] args) {
SyncStudent syncStudent1 = new SyncStudent();
SyncStudent syncStudent2 = new SyncStudent();
syncStudent1.start();
syncStudent2.start();
}
}