Java 멀티스레딩을 이해하는 독자라면 그 역할을 확실히 알 수 있을 것이라 믿습니다. 휘발성 키워드는 int, float, boolean 및 기타 데이터 유형과 같은 단순 유형 변수를 선언하는 데 사용됩니다. 이러한 단순 데이터 유형이 휘발성으로 선언되면 이에 대한 작업은 원자성이 됩니다. 그러나 여기에는 특정 제한이 있습니다. 예를 들어, 다음 예의 n은 원자적이지 않습니다.
다음과 같이 코드 코드를 복사합니다.
패키지 신화 읽기;
공개 클래스 JoinThread는 Thread를 확장합니다.
{
공개 정적 휘발성 int n = 0;
공개 무효 실행()
{
for (int i = 0; i < 10; i++)
노력하다
{
n = n + 1;
sleep(3); // 실행 결과를 더 무작위로 만들기 위해 3밀리초를 지연합니다.
}
잡기 (예외 e)
{
}
}
public static void main(String[] args)에서 예외가 발생했습니다.
{
스레드 스레드[] = 새 스레드[100];
for (int i = 0; i < thread.length; i++)
// 100개의 스레드 생성
스레드[i] = 새로운 JoinThread();
for (int i = 0; i < thread.length; i++)
//방금 생성된 100개의 스레드를 실행합니다.
스레드[i].start();
for (int i = 0; i < thread.length; i++)
//100개의 스레드가 모두 실행된 후 계속됩니다.
스레드[i].join();
System.out.println("n=" + JoinThread.n);
}
}
n에 대한 연산이 원자적이면 최종 출력 결과는 n=1000이어야 합니다. 그러나 위 지역 코드를 실행하면 출력 n이 1000보다 작은 경우가 많아 n=n+1이 원자 수준 연산이 아님을 알 수 있습니다. . 그 이유는 휘발성으로 선언된 단순 변수의 경우 현재 값이 변수의 이전 값과 관련되어 있으면 휘발성 키워드가 효과가 없기 때문입니다. 즉, 다음 표현식은 원자성 연산이 아닙니다.
다음과 같이 코드 코드를 복사합니다.
n = n + 1;
n++;
이 상황을 원자적 연산으로 만들려면 동기화 키워드를 사용해야 합니다. 위 코드를 다음 형식으로 변경할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
패키지 신화 읽기;
공개 클래스 JoinThread는 Thread를 확장합니다.
{
공개 정적 int n = 0;
공개 정적 동기화 무효 inc()
{
n++;
}
공개 무효 실행()
{
for (int i = 0; i < 10; i++)
노력하다
{
inc(); // n = n + 1이 inc()로 변경되었습니다.
sleep(3); // 실행 결과를 더 무작위로 만들기 위해 3밀리초를 지연합니다.
}
잡기 (예외 e)
{
}
}
public static void main(String[] args)에서 예외가 발생했습니다.
{
스레드 스레드[] = 새 스레드[100];
for (int i = 0; i < thread.length; i++)
// 100개의 스레드 생성
스레드[i] = 새로운 JoinThread();
for (int i = 0; i < thread.length; i++)
//방금 생성된 100개의 스레드를 실행합니다.
스레드[i].start();
for (int i = 0; i < thread.length; i++)
//100개의 스레드가 모두 실행된 후 계속됩니다.
스레드[i].join();
System.out.println("n=" + JoinThread.n);
}
}
위의 코드는 n=n+1을 inc()로 변경합니다. 여기서 inc 메소드는 메소드 동기화를 위해 동기화된 키워드를 사용합니다. 따라서 휘발성 키워드를 사용할 때는 주의하세요. 이는 단순 유형 변수가 휘발성으로 수정된다는 의미는 아닙니다. 이 변수에 대한 모든 연산은 n=과 같이 이전 변수에 의해 결정되는 경우입니다. n+1, n++ 등의 경우 휘발성 키워드는 변수의 값이 이전 값과 관련이 없는 경우에만 원자 수준에서 작동합니다. 예를 들어 n = m + 1입니다. 원래 수준이에요. 따라서 휘발성 키를 사용할 때는 주의해야 합니다. 확실하지 않은 경우 휘발성 대신 동기화를 사용할 수 있습니다.