楼主的代码貌似写错了吧?方法上应该没有synchronized这个关键字,因为里面有了。现在分析假如没有第一个if(n=null),那么就和在方法上加synchronized没有区别。在多线程进入的时候,考虑最坏的打算。两个线程都进入,而只有一个线程可以进入synchronized(Single.class),当这个线程出来时,另一个线程进入,但是synchronized里面还有一个判断if(n==null),此时n已经new出对象了。所以直接return n;所以不加第一个if(n==null)是可以的。
但是为什么要加上呢?因为每一个线程进来的时候都需要判断synchronized(Single.class)这个锁。很消耗时间。所以为了优化,而在synchronized(Single.class)前面加上判断if(n==null),此时如果单例设计已经完成,那么别的线程执行这个的话就会直接 return n; 而不用再进行判断synchronized(Single.class).
不知楼主明白了吗? |