1

LinkedList競合状態が発生する Android アプリケーションでを使用しています。1 つのスレッドはデータを に追加し、LinkedList別のスレッドは取得時にデータを削除します。新しく追加したオブジェクトがまったく処理されない状況に遭遇しました。

私はJava同期オブジェクトをグーグルで検索しましたが、考えが簡単すぎるか、何かが欠けています。私が読んだことから、「オブジェクトの同期」は2つのうちでより難しいので、コードを囲むだけでsychronized(object) { };十分かどうか疑問に思っていましたか?

ので、私は持っています:

public void function addMove(Object move) {
  synchronized(list) {
    list.add(move);
  };
};

public void function second() {
   synchronized(list) {
   // iterate through the list
   list.clear;
  };
};

本当に必要なのはこれだけですか?

4

4 に答える 4

3

-あなたの場合、リストがオブジェクトと適切に結合されていて、この唯一の方法以外にアクセスする方法が他にない場合、それで十分だと思います。

-さらに、以下のアプローチも使用できます。

public class Test{

 private LinkedList<Object> list = new LinkedList<Object>();

 public void function addMove(Object move) {
  synchronized(this) {
    list.add(move);
  }
}

public void function second() {
   synchronized(this) {
   list.clear;
  }
 }


}

/////////////////////////////////編集部分////////////// /////////

- データの重要な状態Synchronizationを保護するために行われ、データが保護されるべきものに適用されるか、またはそれにアクセスします。methodatomic statementsfield

- にアクセスできるメソッドまたはアトミック ステートメントにアクセスするために、 によって取得されるロックEvery object1 つだけあります。threadsynchronized instance variables

-同様に、メソッドにアクセスできるスレッドまたはアトミックステートメントにアクセスするためにスレッドによって取得されるロックevery Class1 つだけあります。synchronized static variable

-がオブジェクトthreadのロックを介してアクセスを取得すると、その後、同期されたメソッドまたはアトミック ステートメントへのアクセスを取得し、その時点で別のスレッドが同じオブジェクト lock にアクセスしようとすると、そのスレッドはアクセスを拒否され、に移動しblocked stateます。

于 2012-10-28T18:19:58.620 に答える
1

リストがオブジェクトに適切にカプセル化されている (つまり、他のオブジェクトがリストにアクセスできない) 場合、およびリストにアクセスするメソッドがこれらのメソッドだけである場合は、必要なのはこれだけです。

重要なのは、リストへのすべてのアクセスを同期ブロックで行う必要があるということです。また、同期されたすべてのブロックは、同じオブジェクト (listコード例では ) で同期する必要があります。

于 2012-10-28T18:13:28.657 に答える
0

Android が Java 5 をサポートしているかどうかはわかりませんが、java.util.concurrent には、ConcurrentLinkedQueue など、キューをサポートする優れたクラスが多数含まれています。

于 2012-10-29T05:07:01.463 に答える
0

はい、これがオブジェクトのスレッドのアクセスを制御する方法です。あなたがしなければならないのは、メソッドのタイミングを見ることだけです。clear コマンドは、リストに追加されたデータがある場合にのみ呼び出す必要があります。

于 2012-10-28T18:20:40.307 に答える