只需要进行一次锁就可以了,但是两次判断可以提高效率,不用每次都判断锁;例如:
- public static Single getInstance(){
- if(s==null){
- synchronized(Single.class){
- if(s==null)
- s = new Single();
- }
- }
- }
复制代码
当A线程进入到第二个if语句,持有锁;这时CPU执行B线程,进行第一次if判断 s = null;
但是再执行时发现锁已经被其他线程占用了,就等待;再次等CPU执行A线程时,s 已经通过new
关键字指向了一个对象,就不为空了;再当cup执行B时,s已经部位null,所以就不会再new对象了,这样保证了对象的唯一也不会频繁判断锁了。 |