1

このコンストラクターが無期限にハングする理由は何ですか? スレッドセーフなシングルトンを作成しようとしています。

private RWLockedSingleton() {
    lock.writeLock().lock();
    System.out.println("we're done!");
    isComplete = true;
    lock.writeLock().unlock();
}

ところで、静的なゲッターにロックを配置する方が良いかもしれません。コンストラクターでロックを使用することが本質的に間違っているかどうかを知りたいだけです

4

2 に答える 2

3

IMHO コンストラクターをロックすることは、ほとんどの場合正しくありません。synchronizedコンストラクターに追加できないのには十分な理由があります。コンストラクターを呼び出すメソッドをロックする必要があります。

同じスレッドであっても、readLock() を保持している場合は、writeLock() を永久に待機させることができます。

遅延ロードされたスレッドセーフなシングルトンを作成する最も簡単で、多くの場合最も効率的な方法は、enum

enum Singleton {
    INSTANCE;
}
于 2012-06-18T14:40:21.080 に答える
0

静的ゲッターで、コンストラクターにドロップする直前に lock.readLock のロックを取得したことに気付きました。

JavaDoc によると、スレッドにリーダー ロックがある場合、書き込みロックにエスカレートすることはできません。Exception または Error が発生すると予想していましたが、readLock のロックが解除されるまでスレッドを停止するだけの有効な用途がある場合があります。参考までに、コンストラクターが writeLock を取得しようとすると、以下は機能しません。

public static RWLockedSingleton getSingleton() {
    lock.readLock().lock();
    RWLockedSingleton ref = null;
    if (singleton == null) {
        singleton = new RWLockedSingleton();
        ref = singleton;
    }
    lock.readLock().unlock();
    return ref;
};
于 2012-06-18T14:39:07.320 に答える