1、单例 饿汉式 为啥是线程安全的?
说明:static 变量 singleTon ,被所有对象共享,在内存中只有一个副本,在类初次加载的时候才会初始化
问题:在没有使用这个对象的情况下就加载到内存是一种很大的浪费。
这里有一个很好能说明静态修饰和非静态修饰的说明:
非静态方法调用静态方法就没问题,是因为静态方法在类加载的时候就已经初始化了;
静态方法内调用非静态变量或者方法就报错,是因为,不确定非静态的方法到底有没有完成初始化
2、懒汉式
说明:这种方法在调用Singleton.getInstance()时才会创建对象,起到了延迟加载的作用。
问题:线程不安全,假如有两个线程同时去访问,那么会得到两个不同的实例,避免了上面的提前创建好实例,造成的资源浪费
3、加锁
说明:线程安全,但效率低下,锁住了整个方法
4、减小锁的粒度:
问题:假设2个线程可以同时进入到 if 语句中,线程A实例化对象返回,线程B不用经过判断直接再次实例化对象,并返回另一个对象,为了解决这个问题,引入了臭名昭著的 双重锁机制