正是因为担心并发问题,才在双重检查锁模式中的synchronized
内部进行了再次判断 t==null
。
在第一次判断 t==null
之后,当多个线程同时通过这个检查,其中一个线程会获得锁并创建实例。然而,其他线程在此期间可能会继续等待锁释放,而不知道实例已经被创建了。一旦第一个线程创建了实例并释放了锁,后续等待的线程会依次获得锁。这时,如果没有第二次的 t==null
检查,后续线程会再次创建实例,破坏了单例模式的要求。
因此,在双重检查锁模式中,第二次的 t==null
检查是必要的。它确保在一个线程获得锁并创建实例后,后续线程再次获得锁之前能够检查一次 t
是否已经被初始化,避免了重复创建实例的问题。