私の理解では、Java で「同期ステートメント」を使用して、複数のスレッド間の干渉を停止しています。
今、次の式で expr の意味を理解しようとしています。
同期 (expr) { ステートメント }
ロック動作は expr オブジェクトに依存しているように見えるためです。
例えば
public class Sync extends Thread {
static int [] arr = {0,1,2};
Object lock = new Object();
public static void main(String[] args){
Sync ob1 = new Sync();
Sync ob2 = new Sync();
ob1.start();
ob2.start();
}
@Override
public void run() {
synchronized (arr) {
for(int i = 0;i < arr.length; ++i){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + arr[i]);
}
}
}
}
上記の例で、同期ステートメント (同期 (arr) ) で「arr」オブジェクトを使用している場合、次のように一貫して期待される出力が得られます。
スレッド-0 0
スレッド-0 1
スレッド-0 2
スレッド-1 0
スレッド-1 1
スレッド-1 2
しかし、同期ステートメント (同期 (ロック)) で「ロック」オブジェクトを使用すると、次のような出力が得られます。
スレッド-0 0
スレッド-1 0
スレッド-0 1
スレッド-1 1
スレッド-0 2
スレッド-1 2
どちらの場合も出力が同じであってはなりません。
ありがとう、
シャンタヌ