2011-06-25 4 views
0

私は、同期ブロックが何をしているのか、なぜそれが必要なのかを十分に理解していません。 誰かが「ダミーのための同期」のように説明できますか?Androidは同期していますか?

同期ブロック内で操作するメンバーは、UIスレッドのonPause()メソッドで操作できるため、私が読んでいる本では「同期が必要です」と教えてくれました。 彼はstateChangedという名前のオブジェクトを作成し、それを新しいオブジェクトとしてインスタンス化します。 次に、同期ブロックでは、stateChangedオブジェクトを引数として使用します。 このすべてのものが私を捨てています。私は、何が起こっているのかをかなりよく理解するまで続けていきたいと思います。

答えて

1

古典的な例は次のとおりです。あなたが操作の二つのスレッドを持っている想像し、それらの両方は、同じ方法で参照:globalVarは、このメソッドはと対話し、設定できることを他のいくつかの事前定義された数である

public void addToGlobalVar(int y) { 
int x = globalVar; //what if a thread stops right after this line? 
x += y; 
globalVar = y; 
} 

を。 globalVarは、あなたが完全に1が停止し、他のCPU時間を取得し、正確なナノ秒を知っていることはありませんので、スレッドは、ある程度任意ベースで計算時間を得る50

であると言うことができます。

この例では、UIスレッドに加えてAsyncTaskを起動し、ある時点で両方ともaddToGlobalVar(10)を使用すると、そのコードブロックの2行目で1つのスレッドが中断される可能性があります。他のスレッドがスリープしている間に他のスレッドが通過すると、globalVarは60に正常に設定されます。しかし、もう一方のスレッドが起動すると、x = 50と考えられ、60に設定されます。 50 + 10 + 10 = 60となりました。これがどのように問題になるのかが分かります。

この単純な例を修正するには、計算アトミック(x、1行、すべての計算をスキップしてスキップ)を実行するか、論理が1行に凝縮できなかった場合、​​を使用してください。

+0

1行に収まるという理由だけでは、アトミックまたはスレッドセーフではありません。 – Coeffect

0

あなたは、あなたがそれを使用する前に、完全にそれを理解する必要があります。これは、オブジェクト指向モニタを使用して標準的なアンドロイドの同期です。マルチスレッドプログラムを書くには理解しなければなりませんが、何らかの形で日付が付けられています(java.util.concurrentをスレッド/同期にもっとうまく使用する方が良い)。

http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html

1

読むための本を実際にJavaの並行処理です:

はとにかく - 関連するJavaのチュートリアル部分を読んで - あなたはそれが何であるかを知る必要があります。

あなたのコードは、これはJavaのコンセプトであるのDalvik上で動作していることになるだろうが、あなたは本当にただ、アンドロイドからこのアイデアを分離する必要があります。 Androidのものではありません。

同期ブロックはオブジェクトを任意のオブジェクトとして取り込み、フローが同期ブロックのボディに入ると、パラメータと同じインスタンス(オブジェクト)を持つ同期ブロックに実行される他のスレッドは直前のものが完了するのを待ちます。それは非常に基本的な説明です。

これは、コンピュータ科学の全体サブフィールドであり、深刻な研究なしで、あなたはおそらくそれを理解できないだろう。

関連する問題