synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); }
时间: 2024-02-15 20:47:32 浏览: 87
这段代码是一个经典的单例模式的实现方式。在多线程环境下,如果没有同步控制,在多线程并发访问时可能会创建多个实例,违反了单例模式的原则。所以在这段代码中,使用了 synchronized 关键字对 Singleton 类进行同步,确保在同一时刻只有一个线程能够访问该类的实例化过程。如果 singleton 对象为 null,才会创建一个新的 Singleton 对象并将其赋值给 singleton 变量。这种方式可以保证在多线程环境下,也能够正确实现单例模式。
相关问题
public class SingleTon { private static SingleTon i; public SingleTon() { } public static SingleTon getI() { if (i==null){ synchronized (SingleTon.class){ if (i==null){ i=new SingleTon(); } } } return i; } }
这段代码是一个单例模式的实现,保证在程序运行期间只有一个实例被创建。在单例模式中,构造函数通常是私有的,以防止外部实例化该类。而在这个例子中,构造函数是公有的,因此可以直接在外部实例化该类。
getI() 方法是一个静态方法,可以通过类名直接调用。它使用双重检查锁定机制来保证线程安全并返回单例对象 i。如果 i 为 null,则首先获取 SingleTon.class 的监视器锁,然后再次检查 i 是否为 null。如果 i 仍然为 null,则实例化单例对象 i 并将其赋值给 i 变量。最后返回单例对象 i。
这个单例模式的实现是一种比较高效的延迟初始化方式,并且在多线程环境下也能够保证线程安全。
public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } 为什么非要写第一个if
这是因为当多个线程同时访问 `getInstance()` 方法时,如果没有第一个 `if` 判断,那么每个线程都会进入同步代码块,这就会造成资源浪费和性能问题。因此,第一个 `if` 判断可以确保只有第一次调用 `getInstance()` 方法时才会进入同步代码块,而后续的调用直接返回已经创建好的实例,避免了不必要的同步开销。
此外,还需要使用 `volatile` 关键字,确保线程之间的可见性,避免出现不同线程对同一变量的读写操作的冲突问题。
阅读全文