このプログラムが無限ループで実行されるのはなぜですか?相互排除

過剰交換

以下は、相互排除について学び始めたJavaプログラムです。

class MutexVar{
    public static int Turn = 1;
}

class CriticalSection{
    private static int modelNumber =0;
    public static void setModelNumber(int number){
        modelNumber = number;
    }

    public static int getModelNumber(){
        return modelNumber;
    }
}

public class MutualExclusion{
    public static void main(String[] args){
        Thread threadObjRef = new Thread(new Runnable(){
            public void run(){
                int autoVar = 1;
                int newModelNumber = -1;
                while(true){
                    /*                               Non - critical section - start   */
                    System.out.println("\n" + "In  run() thread");
                    /*                               Non - critical section - end     */
                    while(MutexVar.Turn == 2){
                        //System.out.println("loop-run"); //infinite loop problem is here
                    }
                    /*                               Critical Section -start          */
                    CriticalSection.setModelNumber(autoVar);
                    newModelNumber = CriticalSection.getModelNumber();
                    MutexVar.Turn = 2;
                    /*                               Critical Section -end            */

                    /*                               Non - critical section - start   */
                    System.out.println("run() thread: " + newModelNumber + "\n");
                    autoVar = autoVar + 2;
                    /*                               Non - critical section - end     */
                }
            }
        });
        threadObjRef.start();
        int autoVar = 0;
        int newModelNumber = -1;
        while(true){

            /*                                       Non - critical section - start    */
            System.out.println("\n" + "In  main thread");
            /*                                       Non - critical section - end      */
            while(MutexVar.Turn == 1){
                //System.out.println("loop-main"); //infinite loop problem is here
            }
            /*                                       Critical Section -start           */
            CriticalSection.setModelNumber(autoVar);
            newModelNumber = CriticalSection.getModelNumber();
            MutexVar.Turn = 1;
            /*                                       Critical Section -end             */

            /*                                       Non - critical section - start    */
            System.out.println("main- thread: " + newModelNumber + "\n");
            autoVar = autoVar + 2;
            /*                                       Non - critical section - end      */
        }
    }
}

私の質問:

1)設定する2つのスレッド間にデータ競合がありMutexVar.Turnますか?

2)いいえの場合、このプログラムは私には良さそうですが、私のプログラムは以下の出力で無限にループします。なぜ無限ループなのloop-runloop-main

In  main thread

In  run() thread
run() thread: 1


In  run() thread

私の観察:

これは、スレッドのスケジューリングの問題のようです。JavaスレッドはWindowsのCreateThread()APIを使用して内部的に作成kernel32.dllされ、OSによってWindowsの1-1スレッドモデルとしてスケジュールされているため、WindowsOSに表示されることを学びましたjavaプログラムは、Windows7マルチコアOSでjavajdk1.6を使用して実行されます。

ジョン・ヴィントン

共有された可変データへのアクセスを常に同期します。JIT / CPUが何をしているのかは明確ではありませんが、非揮発性を使用すると、ほぼ確実にスレッドキャッシングの問題が発生しTurnます。MutrexVarとして宣言する

static class MutexVar {
    public static volatile int Turn = 1;
}

キーワードの揮発性は、この値を読み取る各スレッドは最新の値を持ち、コンパイラの並べ替えを禁止します。


コンパイラの並べ替えの詳細。JITコンパイラーは、コードを取得して、の読み取りを引き上げることができますTurn例えばそれは変形することができます

while(MutexVar.Turn == 1){
    //System.out.println("loop-main"); //infinite loop problem is here
}

if(MutexVar.Turn == 1) {
    while(true) {
        //System.out.println("loop-main"); //infinite loop problem is here
    }
 }

これはJavaのコンパイラコントラクトに違反することはなく、パフォーマンスを劇的に向上させることができます。フィールドをvolatileと宣言すると、このタイプまたは並べ替えが防止されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

以下のノードjsプログラムでS関数内の最初のforループが無限に実行されるのはなぜですか?

分類Dev

プログラムが無限ループを実行しているのはなぜですか?Python

分類Dev

このbashプログラムが無限ループに陥るのはなぜですか?

分類Dev

入力が1のときにこのプログラムが実行されるのはなぜですか?

分類Dev

なぜこのループはcで無限に実行されているのですか?

分類Dev

以下のプログラムが無限ループになるのはなぜですか?

分類Dev

このJavaプログラムの17行目が実行されないのはなぜですか?

分類Dev

このJavaプログラムでdo-whileループが期待どおりに実行されないのはなぜですか?

分類Dev

サーバーでプログラムが2回実行されるのはなぜですか?

分類Dev

プログラムが無限にループするのはなぜですか?

分類Dev

BlockingCollectionのforeachループが無限に実行されるのはなぜですか?

分類Dev

この単純なjspプログラムが実行されていないのはなぜですか?

分類Dev

プログラムが実行されないのはなぜですか?

分類Dev

「Circle」プログラムが実行されないのはなぜですか?

分類Dev

Javaプログラムが実行されないのはなぜですか?

分類Dev

このマルチスレッドプログラムが無限ループでスタックするのはなぜですか?

分類Dev

このプログラムを実行するとエラーが発生するのはなぜですか

分類Dev

このプログラムがループするのはなぜですか?

分類Dev

このJavaプログラムが無限であるのはなぜですか?

分類Dev

Javaのプログラムではありませんられる原因はありませんStackOverflowので無限に実行されますが、プログラムが終了したことがない - 数独ジェネレータ

分類Dev

Java ExecutorService-なぜこのプログラムが実行され続けるのですか?

分類Dev

このPythonプログラムに実行時エラーがあるのはなぜですか?

分類Dev

このプログラムが無効なパラメータが渡されたことを通知するのはなぜですか?

分類Dev

このプログラム内で想定されているように関数呼び出しが実行されないのはなぜですか?

分類Dev

文字列タイプが原因でc ++プログラムが実行されないのはなぜですか?

分類Dev

プログラムが大量のメモリを使用して実行されるのはなぜですか?

分類Dev

プログラムの実行時に「./」が使用されるのはなぜですか?

分類Dev

必要なヘッダーファイルがコメントアウトされているにもかかわらず、このC ++プログラムがコンパイルされて実行されるのはなぜですか?

分類Dev

このプログラムを実行すると、「ValueError:値が多すぎて解凍できません」と表示されるのはなぜですか?

Related 関連記事

  1. 1

    以下のノードjsプログラムでS関数内の最初のforループが無限に実行されるのはなぜですか?

  2. 2

    プログラムが無限ループを実行しているのはなぜですか?Python

  3. 3

    このbashプログラムが無限ループに陥るのはなぜですか?

  4. 4

    入力が1のときにこのプログラムが実行されるのはなぜですか?

  5. 5

    なぜこのループはcで無限に実行されているのですか?

  6. 6

    以下のプログラムが無限ループになるのはなぜですか?

  7. 7

    このJavaプログラムの17行目が実行されないのはなぜですか?

  8. 8

    このJavaプログラムでdo-whileループが期待どおりに実行されないのはなぜですか?

  9. 9

    サーバーでプログラムが2回実行されるのはなぜですか?

  10. 10

    プログラムが無限にループするのはなぜですか?

  11. 11

    BlockingCollectionのforeachループが無限に実行されるのはなぜですか?

  12. 12

    この単純なjspプログラムが実行されていないのはなぜですか?

  13. 13

    プログラムが実行されないのはなぜですか?

  14. 14

    「Circle」プログラムが実行されないのはなぜですか?

  15. 15

    Javaプログラムが実行されないのはなぜですか?

  16. 16

    このマルチスレッドプログラムが無限ループでスタックするのはなぜですか?

  17. 17

    このプログラムを実行するとエラーが発生するのはなぜですか

  18. 18

    このプログラムがループするのはなぜですか?

  19. 19

    このJavaプログラムが無限であるのはなぜですか?

  20. 20

    Javaのプログラムではありませんられる原因はありませんStackOverflowので無限に実行されますが、プログラムが終了したことがない - 数独ジェネレータ

  21. 21

    Java ExecutorService-なぜこのプログラムが実行され続けるのですか?

  22. 22

    このPythonプログラムに実行時エラーがあるのはなぜですか?

  23. 23

    このプログラムが無効なパラメータが渡されたことを通知するのはなぜですか?

  24. 24

    このプログラム内で想定されているように関数呼び出しが実行されないのはなぜですか?

  25. 25

    文字列タイプが原因でc ++プログラムが実行されないのはなぜですか?

  26. 26

    プログラムが大量のメモリを使用して実行されるのはなぜですか?

  27. 27

    プログラムの実行時に「./」が使用されるのはなぜですか?

  28. 28

    必要なヘッダーファイルがコメントアウトされているにもかかわらず、このC ++プログラムがコンパイルされて実行されるのはなぜですか?

  29. 29

    このプログラムを実行すると、「ValueError:値が多すぎて解凍できません」と表示されるのはなぜですか?

ホットタグ

アーカイブ