15

これは本当に明白なはずですが、私は答えを見つけることができません。いくつかの競合状態を回避するために、変数の周りにロックをかける必要があります。私が見ることができることから、アンドロイドドキュメントによると、ロックを使用した非常に単純な解決策が存在します:

Lock l = ...;
l.lock();
try {
    // access the resource protected by this lock
 }
 finally {
     l.unlock();
 }

ここまでは順調ですね。しかし、私は最初の行を機能させることができません。次のようになります。

Lock l = new Lock();

正しいかもしれませんが、eclipseは「タイプロックをインスタンス化できません」と報告します-そしてそれ以上はありません。

助言がありますか?

4

2 に答える 2

17

の使用に非常に熱心な場合は、インターフェースをインスタンス化できないため、実装Lockを選択する必要があります。ドキュメントによると、 3つの選択肢があります:Lock

  • ReentrantLock
  • 条件これはロック自体ではなく、Conditionsがsにバインドされているため、ヘルパークラスLockです。
  • ReadWriteLock

あなたはおそらくReentrantLockいくつかConditionのsでおそらく探しています

これは、Lock l = new Lock();あなたの代わりに次のことを行うことを意味します。

ReentrantLock lock = new ReentrantLock();

ただし、ロックする必要があるのが小さな部分だけの場合は、同期されたブロック/メソッドの方がクリーンです(@ Leonidosと@assyliasによって提案されています)。

値を設定するメソッドがある場合は、次のことができます。

public synchronized void setValue (var newValue)
{
  value = newValue;
}

または、これがより大きなメソッドの一部である場合:

public void doInfinite ()
{
  //code
  synchronized (this)
  { 
    value = aValue;
  }
}
于 2013-01-06T21:27:55.810 に答える
1

Lockがインターフェースであり、インスタンス化できないという理由だけで。そのサブクラスを使用します。

于 2013-01-06T21:28:23.690 に答える