10

startTime変数セットを 1 回だけ保証するために、次のコードを使用します。

public class Processor
{
    private Date startTime;

    public void doProcess()
    {
        if(startTime == null)
            synchronized(this)
            {
                  if(startTime == null)
                  {
                     startTime = new Date();
                  }
            }

        // do somethings
    }
}

このコードにより、呼び出しメソッド呼び出しの回数に関係なく、一度だけインスタンス化される変数を保証しprocessます。

私の質問は:

コードをより簡潔にするための代替アプローチはありますか? (サンプルの remove if&synchronizedステートメント用)

4

6 に答える 6

11

AtomicReferenceを使用します。

public class Processor {
  private final AtomicReference<Date> startTime = new AtomicReference<Date>();
  public void doProcess() {
    if (this.startTime.compareAndSet(null, new Date())) {
      // do something first time only
    }
    // do somethings
  }
}
于 2012-07-25T12:19:34.997 に答える
11

あなたのコメントに基づいて、AtomicReferenceを使用できます

firstStartTime.compareAndSet(null, new Date());

またはアトミックロング

firstStartTime.compareAndSet(0L, System.currentTimeMillis());

私は使うだろう

private final Date startTime = new Date();

また

private final long startTime = System.currentTimeMillis();
于 2012-07-25T12:18:10.753 に答える
4

あなたのコードは、いわゆる「ダブルチェックロック」の例です。この記事を読んでください。このトリックは非常にスマートですが、Java では機能しない理由が説明されています。

于 2012-07-25T12:19:35.480 に答える
2

他のポスターがすでに説明したことを要約するには:

private volatile Date startTime;

public void doProcess()
{
   if(startTime == null) startTime = new Date();
   // ...
}

あなたにとって十分に簡潔ですか?

于 2012-07-25T12:36:31.243 に答える
2

したがって、私の理解では、次のシングルトンが必要です。

  1. 短く、実装/理解が容易。
  2. doProcessが呼び出されたときにのみ初期化されます。

ネストされたクラスを使用した次の実装をお勧めします。

public class Processor {
    private Date startTime;

    private static class Nested {
        public static final Date date = new Date();
    }

    public void doProcess() {
        startTime = Nested.date; // initialized on first reference
        // do somethings
    }
}
于 2012-07-25T12:43:17.437 に答える
0

1使用したものはとして知られていdouble checked lockingます。

2.それを行うための別の2つの方法があります

  - Use synchronized on the Method
  - Initialize the static variable during declaration.

3.if Noとsynchronizedキーワードを使用した例が必要なため、Initialize the static variable during declaration.方法を示します。

public class MyClass{

  private static MyClass unique = new MyClass();

  private MyClass{}

  public static MyClass getInstance(){

      return unique;

  }

 }
于 2012-07-25T12:21:45.730 に答える