单例懒汉实现解决
同步锁
因此我们可以使用同步锁,通过修饰符synchronized
去修饰getInstance()
方法。
注:
通过
synchronized
关键字来实现,所有加上synchronized
和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用,线程之间会产生互斥,与此同时就不会出现多线程导致生成多个实例对象
package com.jachie.singleton;
/**
* 懒汉式:实例对象不会直接初始化,直到第一次调用的时候才会初始化
* @author 哒哒哒
*
*/
public class SingletonTwo {
private SingletonTwo(){ }
private static SingletonTwo instance = null;
synchronized public static SingletonTwo getInstance() {
if(instance == null) {
instance = new SingletonTwo();
}
return instance;
}
}
优缺点
- 加上同步锁的目的是为了让线程在
getInstance()
方法实现互斥,从而保障了线程安全。 - 但是给方法加上
synchronized
后会使所有的getInstance()
方法调用都变得同步,而我们仅仅只是想在第一次调用的时候实现同步就好,就好比饿汉式
加载了就创建就好,不会太过于消耗性能,而此方式的同步会消耗性能。