0

ここに私が一度見たいくつかのコードがあります。何が悪いのか分かりますか?

[更新しました]

public class ResourceManager1
{
    private final String mutex = "";
    Object resource = null;

    public Object getResource()
    {
        synchronized (mutex)
        {
            if (resource == null)
            {
                resource = new Object();
            }
        }

        return resource;
    }
}

public class ResourceManager2
{
    private final String mutex = "";
    Object resource = null;

    public Object getResource()
    {
        synchronized (mutex)
        {
            if (resource == null)
            {
                resource = new Object();
            }
        }

        return resource;
    }
}
4

3 に答える 3

12

文字列、特にインターンされている文字列リテラルでは決して同期しないでください。基本的に、ロックは 1 つしかありません。

一般に、外部可視性の目的が正確にロックを目的としている場合を除き、クラスの外部に表示される可能性のある参照 (「this」を含む) を同期しないでください。私は通常private final、ロックのためだけに作成された変数を使用します。

于 2008-12-05T11:03:45.907 に答える
1

両方のクラスで同じ文字列をミューテックスとして使用しているため、一度に使用できるのは同期ブロックの 1 つだけです。これはコードの意図ではないようです。

于 2008-12-05T11:04:25.123 に答える
0

ミューテックスは最終ではなく、リソースはプライベートではありません。

また、リソースを返す getResource メソッドが必要ですが、これは単なるタイプミスだと思います。

于 2008-12-05T11:03:22.503 に答える