Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java의 메모리 일관성 오류

<시간/>

멀티스레딩 개념이 구현되면 한 스레드에서 변경한 내용이 다른 스레드에서 보이지 않을 수 있습니다. 이는 각 스레드의 보기가 서로 일치하지 않음을 나타냅니다. 이것을 메모리 일관성 오류라고 합니다.

CPU는 다른 순서로 주 메모리 액세스를 시작할 수 있지만 스레드는 다른 순서로 액세스할 수 있습니다.

이것은 쓰기 작업이 수행될 때 일반적으로 적용되므로 CPU 대기 시간을 피할 수 있습니다.

쓰기 작업은 원자적 작업이므로 쓰기 작업이 수행될 때 다른 스레드에서 다른 작업을 수행하지 않습니다.

또한 쓰기 작업이 수행되는 순서는 연결된 모든 CPU에 대해 일관되게 유지되는 반면 CPU는 다른 방식으로 다른 CPU의 쓰기 시간을 이해할 수 있습니다. 이 현상은 메모리 불일치로 이어질 수 있습니다.

메모리 불일치 오류를 어떻게 피할 수 있습니까?

단일 스레드가 메모리 쓰기를 수행하고 동일한 메모리에서 다른 스레드가 수행하는 읽기 작업을 볼 수 있도록 발생 이전 관계가 설정되어야 합니다.

'시작' 기능과 '조인' 기능은 발생 전 관계로 간주됩니다. 'start' 기능은 새로 생성된 스레드가 보이는지 확인합니다. 'join' 기능은 보이는 스레드가 다른 스레드에 결합되었는지 확인합니다.

예시

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'라는 또 다른 함수는 일련의 숫자를 반복하고 매번 감소하고 콘솔에 출력을 표시합니다. Demo라는 클래스에는 클래스의 인스턴스를 만들고 새 스레드를 만드는 기본 함수가 포함되어 있습니다. 이 스레드는 재정의되고 이 개체 인스턴스에서 실행 기능이 호출됩니다. 두 번째 스레드에서도 동일한 작업이 수행됩니다. 이 두 스레드는 모두 '시작' 함수로 호출됩니다.