如果不加if(s==null),就存在安全隐患。比如说线程A和B都经过第一次if(s==null)判断后就跳转到线程C了,线程C没有跳转,直接进去newl了一个对象,然后线程C释放了。又轮到A进去了,这个时候虽然S不等于null了,但是A线程已经在s=null的时候就走完了判断,进入到同步代码区里,如果不再一次判断s是否等于null,A线程就会再new一个对象,同理B也会new一个对象,这样就不能保证对象唯一性了。所以获得锁进入之后也要再次判断。这样的安全隐患是有几率发生的,所以一定要两次判断。 |
|