4

私のクラスには、次のようなコードがあります。

int counter1;
int counter2;

public void method1(){
 if (counter1>0) {
  ...........do something
   if (counter2>0) {
    ....do something else
    }
}

public void method2() {
  counter1=0;
  counter2=0;
}

両方のカウンターを一緒に設定する必要があります。恐れ入りますが、OSがmethod1にできるのは、counter1を設定した後でのみ呼び出すことができます。それは可能ですか?ありがとう。

4

3 に答える 3

4

他の回答が示唆するようにsynchronizedキーワードを使用するか、カウンターへの書き込みよりも読み取りが多い場合はReentrantReadWriteLockを使用して、パフォーマンスを向上させます。ロックについては、http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.htmlで読むことができます。

private int counter1;
private int counter2;
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();

public void method1(){
   r.lock();
   try { 
     if (counter1>0) {
        ...........do something
     if (counter2>0) {
        ....do something else
     }
   } finally { r.unlock(); }

}

public void method2() {
  w.lock();
  try { 
    counter1=0;
    counter2=0; 
  } finally { w.unlock(); }

}
于 2012-02-10T10:08:07.783 に答える
3

もちろん、synchronizedキーワードを使用してください。

private final Object LOCK = new Object();
int counter1;
int counter2;

public void method1() {
  synchronized(LOCK) {
     if (counter1>0) {
      ...........do something
       if (counter2>0) {
        ....do something else
       }
    }
}
public void method2() {
  synchronized(LOCK) {
    counter1=0;
    counter2=0;
  }
}

いくつかのヒント:

同期されたメソッドをマークするのではなく、同期にプライベートオブジェクトを使用します。これにより、クラスの外部にあるものがロックを取得して停止するのを防ぐことができます。

どこでもsynchronizedキーワードを使用していることを確認し、常に同じオブジェクトで同期していることを確認してください。これらのいずれかを実行するのを忘れた場合、2つのプロセスが同時にフィールドにアクセスできます。

デッドロックに注意してください。完璧な世界では、単体テストを作成して、ロックが思ったとおりに機能していることを確認します。

于 2012-02-10T10:00:36.697 に答える
1

同期されたブロックまたはメソッドを使用して、2つのカウンターへのアクセスをラップします。ロックするには、同じオブジェクトを使用することを忘れないでください。

于 2012-02-10T10:07:45.693 に答える