0
abstract class A {
  protected abstract int isRunning();

  public void concreteMethod() {
    synchroinzed(isRunning()) {
       //do stuff
    }
  }
}

class B extends A {
  int running_ = 0;

  public int isRunning() {
     return running_;
  }
}

私が得る問題: int は、同期されたステートメントの有効な型の引数ではありません。どうすればいいですか?

4

6 に答える 6

3

ブロックとメソッドの同時実行を防ぎたい場合は、継承できないisRunning()ため、希望どおりに実行することはできません(実装のみが正当化できます)。synchronizationsynchronization

これがあなたができる最も近いものです:

class A {
  protected Object lock = new Object();
  protected abstract int isRunning();
  public void concreteMethod() {
    synchronized(lock) {
       //do stuff
    }
  }
}

class B extends A {
  int running_ = 0;    
  public int isRunning() {
    synchronized(lock) {
     return running_;
    }
  }
}

ブロックだけでなく全体をロックする余裕がある場合は、キーワードをとconcreteMethod()に追加する簡単な解決策があります。synchronizedconcreteMethodisRunning()

class A {
  protected abstract int isRunning();
  public synchronized void concreteMethod() {
       //do stuff
  }
}

class B extends A {
  int running_ = 0;    
  public synchronized int isRunning() {
     return running_;
  }
}
于 2012-10-22T14:27:46.287 に答える
1

プリミティブ値をロックすることはできません(intあなたの場合は、をisRunning()返すのでint)。

たとえば、置き換えintてみてください。Integer

于 2012-10-22T14:29:23.187 に答える
1

これは公式ドキュメントが言うことです

Another way to create synchronized code is with synchronized statements. Unlike synchronized methods, synchronized statements must specify the object that provides the intrinsic lock

つまり、同期するには、まずロックするオブジェクトが必要です。intはオブジェクトではないため、エラーが発生します。オブジェクトではこのエラーは発生しませんが、代わりにIntegerを使用するだけでは正確性は保証されません。Integerint

これは、Java 並行性に関する非常に優れたチュートリアルです。

http://tutorials.jenkov.com/java-concurrency/index.html

于 2012-10-22T14:34:05.097 に答える
1

あなたは2つの概念を混同していると思います。Synchronized ブロックは常にパラメータ時間として参照を要求しますが、引数として int (プリミティブ データ型) を渡しています。'this' キーワードを (isRunning() メソッドの代わりに) 同期ブロック パラメーターとして使用してみることができます。また、クラス A を抽象として宣言する必要があります。また、コードにスペルミスがあります。@dystroy のソリューションも検討できます。

于 2012-10-22T14:39:29.127 に答える
0

私はあなたがこれを探していると思います:

class A
{
  protected abstract int isRunning();

  public synchronized void concreteMethod()
  {
       //do stuff
  }
}

class B extends A
{
  int running_ = 0;

  public synchronized int isRunning()
  {
   return running_;
  }

}
于 2012-10-22T14:28:01.130 に答える
0

- sychronizedブロックには、実行スレッドがそのブロックにアクセスするためにロックを取得する必要があるObjectが伴います。

- intprimitive型であり、オブジェクトではありません。

-スーパークラスのオブジェクトとともに同期ブロックを作成すると、そのサブクラスから簡単にアクセスできます。

例えば:

public void concreteMethod()
  {
    synchroinzed(A.class) // or synchroinzed(A.class)
    {
       //do stuff
    }
  }
于 2012-10-22T14:29:49.897 に答える