私はJavaで同期メソッドの概念を把握しようとしていますが、少なくとも私にとっては混乱しているような動作に遭遇しました。 Iは、INC()メソッドの同期の使用が順次インクリメントをもたらすことが期待Java同期メソッドの使用
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
:
public class parallelUpdate
{
public static void main(String[] args)
{
Ob ob = new Ob();
new Thread(ob).start();
new Thread(ob).start();
}
}
class Ob implements Runnable
{
static int cnt = 0;
private synchronized void inc()
{
cnt++;
}
@Override
public void run()
{
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread());
inc();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
...インクリメントが両方のトレッドにより並行して行われる:コードで like:
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-0,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
Thread[Thread-1,5,main]
私のコードに間違いがありますか?
'inc()'メソッドの代わりに 'run()'メソッドを 'synchronized'にしてみてください。 – Jesper
スレッドを処理するために 'atomic Integer'クラスのメソッドを使用します。 –
" inc()メソッドでsynchronizedを使用すると、シーケンシャルなインクリメントが得られると思います。 'inc'メソッドのみを同期しました。つまり、2つのスレッドで並列に実行することはできませんが、特定の実行順序になるわけではありません。 – talex