java设计模式,单例模式(延迟加载)

之前学到了synchronized同步锁,发现原来的单例模式(延迟加载)有一些问题:

package thread;
/**
 * 延迟加载 单例模式
 * @author asus
 *
 */
public class SingleDemo {

	private static SingleDemo sd = null;
	private SingleDemo(){
		
	}		
	
	public static SingleDemo getInstance(){

		if(sd==null){
			sd = new SingleDemo();
		}


		return sd;
	}
}

例如上面,一个延迟加载的单例模式,在运行过程中如果第一个线程拿到空对象后因为某些原因失去执行权,因为还没有初始化,所以被第二个线程仍然可以拿到空对象并进行第一次初始化,这时第一个线程再次执行时,这样就会得到两个SingleDemo,无法保证单例。

这时候synchronized就可以发挥作用了

package thread;
/**
 * 延迟加载 单例模式
 * @author asus
 *
 */
public class SingleDemo {

	private static SingleDemo sd = null;
	private SingleDemo(){
		
	}		
	
	public static SingleDemo getInstance(){
		if(sd==null){
			synchronized(SingleDemo.class){
				if(sd==null){
					sd = new SingleDemo();
				}
			}
		}
		return sd;
	}
}

这段代码中,使用synchornized锁定限制只有一个进程进行初始化,使用两次判断保证之前等在锁外边的线程不会重复创建新对象。

你可能感兴趣的:(设计模式)