37. 同期
37. 同期
スレッドを同期させない場合
L:\lesson092\test.java
class test extends Thread { static int var1 , var2; public static void main(String args[]) { test obj = new test(); obj.start(); for(int i = 0 ; i < 5 ; i++) obj.add(); } void add() { var1++; System.out.println("処理1 : var1 = " + var1 + " : var2 = " + var2); try { Thread.sleep(10); } catch(InterruptedException err) { } var2++; System.out.println("処理2 : var1 = " + var1 + " : var2 = " + var2); } public void run() { for(int i = 0 ; i < 5 ; i++) add(); } }
実行結果
L:\lesson092>java test
処理1 : var1 = 1 : var2 = 0
処理1 : var1 = 2 : var2 = 0
処理2 : var1 = 2 : var2 = 1
処理1 : var1 = 3 : var2 = 1
処理2 : var1 = 3 : var2 = 2
処理1 : var1 = 4 : var2 = 2
処理2 : var1 = 4 : var2 = 3
処理1 : var1 = 5 : var2 = 3
処理2 : var1 = 5 : var2 = 4
処理1 : var1 = 6 : var2 = 4
処理2 : var1 = 6 : var2 = 5
処理1 : var1 = 7 : var2 = 5
処理2 : var1 = 7 : var2 = 6
処理1 : var1 = 8 : var2 = 6
処理2 : var1 = 8 : var2 = 7
処理1 : var1 = 9 : var2 = 7
処理2 : var1 = 9 : var2 = 8
処理1 : var1 = 10 : var2 = 8
処理2 : var1 = 10 : var2 = 9
処理2 : var1 = 10 : var2 = 10
synchronized 修飾子
L:\lesson093\test.java
class test extends Thread { static int var1 , var2; public static void main(String args[]) { test obj = new test(); obj.start(); for(int i = 0 ; i < 5 ; i++) obj.add(); } synchronized void add() { var1++; System.out.println("処理1 : var1 = " + var1 + " : var2 = " + var2); try { Thread.sleep(10); } catch(InterruptedException err) { } var2++; System.out.println("処理2 : var1 = " + var1 + " : var2 = " + var2); } public void run() { for(int i = 0 ; i < 5 ; i++) add(); } }
実行結果
L:\lesson093>java test
処理1 : var1 = 1 : var2 = 0
処理2 : var1 = 1 : var2 = 1
処理1 : var1 = 2 : var2 = 1
処理2 : var1 = 2 : var2 = 2
処理1 : var1 = 3 : var2 = 2
処理2 : var1 = 3 : var2 = 3
処理1 : var1 = 4 : var2 = 3
処理2 : var1 = 4 : var2 = 4
処理1 : var1 = 5 : var2 = 4
処理2 : var1 = 5 : var2 = 5
処理1 : var1 = 6 : var2 = 5
処理2 : var1 = 6 : var2 = 6
処理1 : var1 = 7 : var2 = 6
処理2 : var1 = 7 : var2 = 7
処理1 : var1 = 8 : var2 = 7
処理2 : var1 = 8 : var2 = 8
処理1 : var1 = 9 : var2 = 8
処理2 : var1 = 9 : var2 = 9
処理1 : var1 = 10 : var2 = 9
処理2 : var1 = 10 : var2 = 10
synchronized ブロック
L:\lesson094\test.java
class test extends Thread { SyncTest sync; public static void main(String args[]) { SyncTest sync = new SyncTest(); for(int i = 0 ; i < 10 ; i++) { test obj = new test(sync); obj.start(); } } public test(SyncTest sync) { this.sync = sync; } public void run() { synchronized(sync) { sync.add(); } } } class SyncTest { int var1, var2; void add() { var1++; System.out.println("処理1 : var1 = " + var1 + " : var2 = " + var2); try { Thread.sleep(100); } catch(InterruptedException err) { } var2++; System.out.println("処理2 : var1 = " + var1 + " : var2 = " + var2); } }
実行結果
L:\lesson094>java test
処理1 : var1 = 1 : var2 = 0
処理2 : var1 = 1 : var2 = 1
処理1 : var1 = 2 : var2 = 1
処理2 : var1 = 2 : var2 = 2
処理1 : var1 = 3 : var2 = 2
処理2 : var1 = 3 : var2 = 3
処理1 : var1 = 4 : var2 = 3
処理2 : var1 = 4 : var2 = 4
処理1 : var1 = 5 : var2 = 4
処理2 : var1 = 5 : var2 = 5
処理1 : var1 = 6 : var2 = 5
処理2 : var1 = 6 : var2 = 6
処理1 : var1 = 7 : var2 = 6
処理2 : var1 = 7 : var2 = 7
処理1 : var1 = 8 : var2 = 7
処理2 : var1 = 8 : var2 = 8
処理1 : var1 = 9 : var2 = 8
処理2 : var1 = 9 : var2 = 9
処理1 : var1 = 10 : var2 = 9
処理2 : var1 = 10 : var2 = 10