📜  blockingSIngle 与首先阻塞 (1)

📅  最后修改于: 2023-12-03 15:13:40.281000             🧑  作者: Mango

BlockingSingle: 首先阻塞的单例模式

在某些场景下,单例模式需要保证只有一个实例被创建。然而,在多线程的环境下,单例模式可能面临并发访问的问题。当多个线程同时调用获取单例的方法时,可能会导致多个实例被创建,从而破坏单例模式。

为了解决上述问题,可以使用阻塞的单例模式。阻塞的单例模式可以保证在任何时候只有一个实例被创建,而且在多个线程同时调用获取单例的方法时,会被阻塞,直到其他线程完成了单例的创建。

下面是一个阻塞的单例模式的实现:

public class BlockingSingle {

    private static BlockingSingle instance;
    private static Lock lock = new ReentrantLock();
    private static Condition condition = lock.newCondition();

    private BlockingSingle() {}

    public static BlockingSingle getInstance() {
        lock.lock();
        try {
            if (instance == null) {
                instance = new BlockingSingle();
            }
            return instance;
        } finally {
            lock.unlock();
        }
    }

}

在上述实现中,我们使用了 LockCondition 来实现阻塞。在获取单例的方法中,首先获取锁,然后判断单例是否已经被创建。如果单例还没有被创建,那么就创建一个新的实例,并返回。在方法结束前,释放锁。

对于其他线程,在调用获取单例的方法时,如果发现单例还没有被创建,那么就会被阻塞,直到其他线程创建完单例并释放锁。

需要注意的是,由于阻塞的单例模式可能会阻塞线程,导致程序的性能下降。因此,阻塞的单例模式一般只在必要的场景下使用。