Keep the bar green to keep the code clean.要时刻记住这句话,曾经我有个同事看见我写下@Test的时候,他说好的程序员不需要写单元测试,从前人的经验来看,单位测试还是比较重要的,不要怕麻烦而忽略的单步测试,当你的应用日益庞大起来,单元测试尤为重要。有空的话开篇博客专门讨论。
言归正传,话说我们已经有了单例,但是我们每次加载这个类的时候都要用到它的实例么?未必。请看:
publicclassMen {privatestatic Men i = new Men();
privatebyte[] data;
privateMen() {
super();
try {
Thread.sleep(100000);
data = newbyte[1024 * 1000000];
} catch (InterruptedException e) {
e.printStackTrace();
}
}
publicstatic Men newInstance() {
return i;
}
publicstatic String sayHello(){
return"Hello";
}
}
分析一下,当第一个线程执行run方法的时候他调用Men.newInstance();判断 i == null为真,进入if语句内部,程序再慢慢的执行,还没有执行到 i = new Men();情况发生了变化,第二个线程夺取了CPU的执行权,当他执行到if条件的时候,当然也为真,这种情况下,两个线程都进入 If块,创建两个实例是迟早的事情,如何解决这个问题,请看代码:
publicclassMen {privatestatic Men i = null;
privateMen() {
super();
}
publicsynchronizedstatic Men newInstance() {
if (i == null) {
try {
Thread.sleep(10000);
i = new Men();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return i;
}
}
publicclassMen {privatestatic Men i = null;
privateMen() {
super();
}
publicstatic Men newInstance() {
if (i == null) {
synchronized (Men.class) {
if (i == null) {
i = new Men();
}
}
}
return i;
}
}
publicclassMen {privatevolatilestatic Men i = null;
privateMen() {
super();
}
publicstatic Men newInstance() {
if (i == null) {
synchronized (Men.class) {
if (i == null) {
i = new Men();
}
}
}
return i;
}
}
Java实现单例单例模式:顾名思义就是这个类只能产生一个对象,无论你实例化多少次,他总是指向内存中的同一块区域。如何能保证一个类只能实例化一个对象呢?不如我们先看看如何实例化对象,请看下面的代码片段public class Men {}没错,上面的Men类空空如也,表面看似如此,但是根据Java语言的规范,一个类要是没有显式的定义构造器的时候,会有一个空参构造器(