单例设计模式----饿汉式,懒汉式在多线程中的隐患问题

单例设计模式----饿汉式,懒汉式在多线程中的隐患问题

饿汉式:因为饿----加载类的时候直接创建对象。

懒汉式:有点懒----调用静态方法时才创建对象

隐患问题:在多线程中懒汉式存在隐患问题,多个类一起进来,然后创建多个不同的对象,但是在单例模式中要求每次拿到的都是同一个对象。如何解决这个问题呢?可以通过加锁的方式确保线程安全,加锁之后又有一个效率问题可以通过双重判断解决。

写程序就是这样,一个bug完善了又会出来新的bug,要么在创造bug要么在解决bug的路上。

class MySingle {

    //懒汉式
    private static MySingle single = null;

	private MySingle() {};   //构造方法私有化

	//通过静态方法获取对象
	static MySingle getInstance() {  //多线程可能会有多个类进来,创建多个对象


		if (single==null) {    //双重判断提高效率
			synchronized ("lock") {    //加锁确保进来的类只有一个
				if (single==null) {
					single =new MySingle();
				}
			}
		}
		return single;
	}
}

//测试类
public class Test {
	public static void main(String[] args) {
		
		MySingle single = MySingle.getInstance();
		MySingle single2 = MySingle.getInstance();
		System.out.println(single == single2);
	}
}

你可能感兴趣的:(java,单例设计模式,线程安全)