Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでのメモリ整合性エラー


マルチスレッドの概念が実装されている場合、一方のスレッドによって行われた変更がもう一方のスレッドに表示されない可能性があります。これは、各スレッドのビューが相互に一貫していないことを示しています。これは、メモリ整合性エラーと呼ばれます。

CPUは異なる順序でメインメモリへのアクセスを開始する可能性がありますが、スレッドは異なる順序でメインメモリへのアクセスを開始する可能性があります。

これは通常、書き込み操作が実行されているときに当てはまり、CPUの待機時間を回避します。

書き込み操作はアトミック操作です。つまり、書き込み操作が実行されているときに、他のスレッドによって他の操作が実行されることはありません。

これに加えて、書き込み操作が実行される順序は、関連付けられたすべてのCPUで一貫して維持されますが、CPUは他のCPUの書き込み時間を異なる方法で理解できます。この現象は、メモリの不整合につながる可能性があります。

メモリの不整合エラーを回避するにはどうすればよいですか?

メモリ書き込みが単一のスレッドによって実行されるように、発生前の関係を確立する必要があります。これは、同じメモリ上の他のスレッドによって実行される読み取り操作に表示されます。

「開始」機能と「参加」機能は、発生前の関係と見なされます。 「開始」関数は、新しく作成されたスレッドが表示されることを確認します。 「結合」機能は、表示されているスレッドが他のスレッドに結合されていることを確認します。

import java.io.*;
class class_shared{
   static int m=2;
   void inc(){
      for(int j=0;j<5;j++){
         m = m+1;
         System.out.println("After its increment is "+m);
      }
   }
   void dec(){
      for(int j=0;j<5;j++){
         m = m-1;
         System.out.println("After its decrement is "+m);
      }
   }
}
public class Demo{
   public static void main(String[] args){
      final class_shared my_inst = new class_shared();
      Thread my_t_1 = new Thread(){
         @Override
         public void run(){
            my_inst.inc();
         }
      };
      Thread my_t_2 = new Thread(){
         @Override
         public void run(){
            my_inst.dec();
         }
      };
      my_t_1.start();
      my_t_2.start();
   }
}

出力

After its increment is 3
After its decrement is 2
After its decrement is 2
After its decrement is 1
After its increment is 3
After its decrement is 0
After its increment is 1
After its increment is 1
After its decrement is 0
After its increment is 2

「class_shared」という名前のクラスは、静的な値とvoid関数を定義します。この関数は、一連の数値を反復処理し、それをインクリメントしてコンソールに表示します。 「dec」という名前の別の関数は、一連の数値を繰り返し、毎回デクリメントして、コンソールに出力を表示します。クラス名のデモには、クラスのインスタンスを作成し、新しいスレッドを作成するmain関数が含まれています。このスレッドはオーバーライドされ、run関数がこのオブジェクトインスタンスで呼び出されます。 2番目のスレッドでも同じことが行われます。次に、これらのスレッドは両方とも「開始」関数で呼び出されます。


  1. 修正:ERR_SOCKET_NOT_CONNECTED

    Google Chromeユーザーには、「 ERR_SOCKET_NOT_CONNECTED」というエラーメッセージが表示されます。 」ブラウザでGoogleのウェブサイトにアクセスしようとしたとき。このエラーメッセージには、いくつかの異なるシナリオがあります。 1つはユーザーがどのウェブサイトにもアクセスできない場合、もう1つはGoogleサイトを除くすべてのウェブサイトにアクセスできる場合です。 このエラーメッセージは、ブラウザのソケットに問題があることを示しています。ソケットは、インターネット上で実行されている2つのプログラム間の双方向通信の1つのエンドポイントと考えることができます

  2. IRQL_NOT_LESS_OR_EQUAL エラーを修正

    値が 0x0000000A のバグ チェックで上記のエラー コードに直面した場合、これは、カーネル モード ドライバーが、割り込み要求レベル (IRQL) が上がっているときに、無効なアドレスでページ メモリにアクセスしたことを示しています。つまり、ドライバーは、必要なアクセス許可を持っていないメモリ アドレスにアクセスしようとしました。 これがユーザー アプリケーションで発生すると、アクセス違反のエラー メッセージが生成されます。これがカーネル モードで発生すると、STOP エラー コード 0x0000000A が生成されます。新しいバージョンの Windows へのアップグレード