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