这些天在看一本书,关于java多线程的,系统的掌握了多线程的一些知识,就简单的把一些学习重要的知识记录下来。
DCL可以解决多线程单例模式的非线程安全问题,当然也可以用其他方式,这里就说另一种用内部类实现的。
如下代码:
package test;
public class MyObject {
// 内部类方式
private static class MyObjectHandler {
private static MyObject myObject = new MyObject();
}
private MyObject() {
}
public static MyObject getInstance() {
return MyObjectHandler.myObject;
}
}
这种方法首先是一个静态内部类,并且是私有的,只能通过getInstance()来获得,
并且由类中成员变量加载方式,类成员最先被加载,并且不受实例变量影响。
另一方面,MyObject的构造方法是私有的,故只能内部实现。
一段测试代码:
package test.run;
import test.MyObject;
public class Run {
class MyThread extends Thread {
@Override
public void run() {
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();
}
}
运行结果: