// Singleton.java 单例模式 双重检查加锁
public class Singleton {
private volatile static Student student;
private Singleton(){}
// 执行过程:
// 1.先判断是否有student实例,如果有,返回实例
// 2.如果第一次执行这个方法,是没有实例的,这时进入if
// 通过synchronized块控制了同步,虽然会造成性能下降,但是只有第一次初始对象时会这样
public static Student getInstance() {
if (student == null) {
synchronized (Singleton.class) {
if (student == null) { // 这个判断必须有,不然无法维持单例
student = new Student();
}
}
}
return student;
}
}
接下来自己创建一个线程-0,用于实例化student,并打印它的地址:
class MyThreadTest extends Thread{
@Override
public void run() {
Student s2 ;
for (int i = 0; i < 5; i++) {
s2 = Singleton.getInstance();
System.out.println("线程"+Thread.currentThread().getName()+
"中创建的学生"+(i+1)+"对象的地址为:"+s2);
}
}
}
下面是测试代码:
class MainTest{
public static void main(String[] args) {
MyThreadTest mtt = new MyThreadTest();
mtt.start(); //启动自定义线程
Student s ;
for (int i = 0; i < 10; i++) {
s = Singleton.getInstance();
System.out.println("线程"+Thread.currentThread().getName()+
"中创建的学生"+(i+1)+"对象的地址为:"+s);
}
}
}