Javaで同期が失敗する

ローマ人

私が読んだチュートリアルから

同じオブジェクトで同期されたメソッドの2つの呼び出しがインターリーブすることはできません。1つのスレッドがオブジェクトの同期メソッドを実行している場合、同じオブジェクトブロックの同期メソッドを呼び出す他のすべてのスレッドは、最初のスレッドがオブジェクトで完了するまで実行を一時停止します。

ただし、私の単純な例では、messageオブジェクトにアクセスするためのレース競争がまだあります。

public class TestThread extends Thread{
    int thread;
    StringBuilder message;

    public TestThread(int thread, StringBuilder message) {
        this.thread=thread;
        this.message=message;
        start();
    }

    public void run() {
        synchronized(this){
            for (int i=0; i<1000000; i++) {
                double a=2*2;
            }
            modifyMessage();
        }
    }

    public synchronized void modifyMessage() {
        message.append(thread);
    }
}

public class TestMultithreading {
    static TestThread[] testThreads = new TestThread[5];

    public static void main(String args[]) {
        StringBuilder message = new StringBuilder("A");
        for (int i=0;i<5;i++)
            testThreads[i] = new TestThread(i, message);
        for (int i=0;i<5;i++)
            try {
                testThreads[i].join();
            } catch (InterruptedException e) {}
        out.println(message);
    }
}

私はこれが長さ6の文字列の保証された出力を持つことを期待しています。しかし、時々私はこのようなものを見ます:

A1034

これは、スレッドの1つがオブジェクトの変更に失敗したことを意味します。誰かが私に説明してもらえますか、なぜこれが起こるのか、そして問題の解決策を提案できますか?

あなたはすでにあなた自身の質問に答えました:

1つのスレッドがオブジェクトの同期メソッドを実行している場合、同じオブジェクトブロックの同期メソッドを呼び出す他のすべてのスレッド

同じオブジェクトのメソッドに対する同期された唯一のブロックアクセス。つまり、すべてのスレッドでmodifyMessage()を同時に呼び出すことができます。

あなたが探しているのはこのようなものです:

   for (int i=0; i<1000000; i++) {
       double a=2*2;
   }
   synchronized(message){
       modifyMessage();
   }

これで、メソッドはStringBuilderインスタンスごとに1回だけ呼び出されます。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Gradle同期が「UnhandledIsstesReporter」で失敗する

分類Dev

Javaスレッドの同期が失敗する

分類Dev

LaravelFirebaseデータ同期が失敗する

分類Dev

Java 11でOpenWebBeans CDIが失敗する

分類Dev

asanaAPI統合がJAVAで失敗する

分類Dev

ChromeでAjax同期リクエストが失敗する

分類Dev

Android Build.gradleの同期がNoSuchFieldErrorで失敗する:FOR_COMPILE

分類Dev

Gradleプロジェクトの同期がParseErrorで失敗する

分類Dev

非同期関数内でawaitが失敗する

分類Dev

非同期ReadDirectoryChangesWがERROR_INVALID_PARAMETERで失敗する

分類Dev

この非同期Jasmineテストが失敗するのはなぜですか?

分類Dev

Intellij / Gradle同期が企業プロキシの背後で失敗する

分類Dev

AmazonCloudWatchLogsClient非同期メソッドがエラーなしで失敗する

分類Dev

Java:java.util.Preferencesが失敗する

分類Dev

Gradleの同期が失敗する-play-services-measurement-base

分類Dev

SeekArcの実装時にビルド同期が失敗する

分類Dev

非同期AJAX呼び出しが失敗する

分類Dev

AndroidStudioがGradleファイルの同期に失敗する

分類Dev

DjangoCMSがdbの同期または移行に失敗する

分類Dev

Glide gradle と firebaseUI が同期に失敗する

分類Dev

この非同期コードが失敗することがあり、観察されない場合にのみ失敗するのはなぜですか?

分類Dev

.bashrcが原因でgitpushが失敗する

分類Dev

Javaで二重比較が失敗する

分類Dev

Java文字列の分割が「\ n」で失敗する

分類Dev

Java NIO Files.createFile()がNoSuchFileExceptionで失敗する

分類Dev

Javaでの日付検証が失敗する

分類Dev

新しいArrayList <int>()がJavaで失敗する

分類Dev

GradleビルドがJava IOExceptionで失敗する

分類Dev

SpringBoot統合テストがjava.awt.HeadlessExceptionで失敗する

Related 関連記事

  1. 1

    Gradle同期が「UnhandledIsstesReporter」で失敗する

  2. 2

    Javaスレッドの同期が失敗する

  3. 3

    LaravelFirebaseデータ同期が失敗する

  4. 4

    Java 11でOpenWebBeans CDIが失敗する

  5. 5

    asanaAPI統合がJAVAで失敗する

  6. 6

    ChromeでAjax同期リクエストが失敗する

  7. 7

    Android Build.gradleの同期がNoSuchFieldErrorで失敗する:FOR_COMPILE

  8. 8

    Gradleプロジェクトの同期がParseErrorで失敗する

  9. 9

    非同期関数内でawaitが失敗する

  10. 10

    非同期ReadDirectoryChangesWがERROR_INVALID_PARAMETERで失敗する

  11. 11

    この非同期Jasmineテストが失敗するのはなぜですか?

  12. 12

    Intellij / Gradle同期が企業プロキシの背後で失敗する

  13. 13

    AmazonCloudWatchLogsClient非同期メソッドがエラーなしで失敗する

  14. 14

    Java:java.util.Preferencesが失敗する

  15. 15

    Gradleの同期が失敗する-play-services-measurement-base

  16. 16

    SeekArcの実装時にビルド同期が失敗する

  17. 17

    非同期AJAX呼び出しが失敗する

  18. 18

    AndroidStudioがGradleファイルの同期に失敗する

  19. 19

    DjangoCMSがdbの同期または移行に失敗する

  20. 20

    Glide gradle と firebaseUI が同期に失敗する

  21. 21

    この非同期コードが失敗することがあり、観察されない場合にのみ失敗するのはなぜですか?

  22. 22

    .bashrcが原因でgitpushが失敗する

  23. 23

    Javaで二重比較が失敗する

  24. 24

    Java文字列の分割が「\ n」で失敗する

  25. 25

    Java NIO Files.createFile()がNoSuchFileExceptionで失敗する

  26. 26

    Javaでの日付検証が失敗する

  27. 27

    新しいArrayList <int>()がJavaで失敗する

  28. 28

    GradleビルドがJava IOExceptionで失敗する

  29. 29

    SpringBoot統合テストがjava.awt.HeadlessExceptionで失敗する

ホットタグ

アーカイブ