0

私たちは、シングルトンを取得するためのコードに取り組んできました。クラスがコレクションに存在する場合はそれを返し、それ以外の場合は作成してコレクションに保存します。すべての get 操作で同期しないように、ダブルチェック ロックを使用します。

ただし、多くの記事によると、二重チェックのロックが壊れています。ただし、マップは既に初期化されており、内容のチェックが行われているため、これがここに当てはまるかどうかはわかりません。皆さんはどう思いますか?ここでダブルチェックロックを機能させる方法はありますか?

Map <Class <?>, Object> clazzes = getClazzes ();
T singleton = null;
if (false == clazzes.containsKey (clazz))
{
     synchronized (clazzes)
     {
         if (false == clazzes.containsKey (clazz))
         {
            try
            {
                singleton = clazz.newInstance ();
                clazzes.put (clazz, singleton);
            }
            catch (InstantiationException e)
            {
                 throw new IllegalArgumentException ( "cannot instantiate class " + clazz, e);
            }
            catch (IllegalAccessException e)
            {
                  throw new IllegalArgumentException ("cannot instantiate class " +  clazz, e);
            }
         }
         else
         {
             singleton = clazz.cast (clazzes.get (clazz));
         }
      }
 }

ありがとう

4

2 に答える 2

0

わかりました、それで私はいくつかの研究をしました。このドキュメントによると、put 操作には、contains キーとの事前発生関係があります。したがって、 ConcurrentHashMap を使用すると、二重チェックのロックが機能するはずです

于 2014-04-28T10:39:53.817 に答える