前几篇讲了通过静态内部类来实现单例模式,主要思路就是私有构造方法+静态内部类。
这里还有一种利用静态代码块来实现的单例模式。
看如下代码:
package test;
public class MyObject {
private static MyObject instance = null;
private MyObject() {
}
static {
instance = new MyObject();
}
public static MyObject getInstance() {
return instance;
}
}
由java变量加载顺序可知,static代码块加载时在static 变量之后,但是又优先于任何实例化对象创建,
具体相关顺序可以参照我一片博客:java中变量加载顺序再学习
所以很明显,instance只会被加载一次,并且不受任何多线程影响,因为当类加载器加载时,就已经被实例化了。
看下面测试代码:
package test.run;
import test.MyObject;
public class Run {
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(MyObject.getInstance().hashCode());
}
}
}
public static void main(String[] args) {
Run.MyThread t1 = new Run().new MyThread();
Run.MyThread t2 = new Run().new MyThread();
Run.MyThread t3 = new Run().new MyThread();
t1.start();
t2.start();
t3.start();
}
}
结果: