>  기사  >  Java  >  자바의 휘발성 키워드

자바의 휘발성 키워드

王林
王林원래의
2024-08-30 16:19:44607검색

Java의 Volatile은 여러 스레드에서 동시에 객체에 액세스하려는 경우 이 키워드를 사용할 수 있습니다. 이 키워드는 클래스, 코드, 메서드를 스레드로부터 안전하게 만드는 또 다른 방법입니다. 즉, 여러 스레드가 문제 없이 동일한 리소스에 액세스할 수 있음을 의미합니다. 위반 키워드는 여러 스레드가 해당 변수 값을 동시에 조작한다고 말할 수 있음을 의미합니다.

무료 소프트웨어 개발 과정 시작

웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등

자바에서 휘발성 키워드를 사용할 때는?

스레드로부터 안전한 코드를 만들고 싶다면 위반 키워드를 사용할 수 있습니다. 또한 동기화를 제공합니다. 이 경우에는 좋은 선택입니다.

이 키워드를 사용하여 선언하는 모든 변수는 캐시되지 않습니다. 읽기, 쓰기 등 우리가 수행하는 모든 작업은 메인 메모리로 이동됩니다.

class DemoSharedObject
{
static int sharedresources = 10;
}

데이터 불일치로 이어지는 사례는 다음과 같습니다.

DemoSharedObject라는 클래스가 하나 있습니다. 여러 스레드가 이 클래스에서 작업하고 클래스 멤버의 값을 수정한다고 가정해 보겠습니다. 따라서 서로 다른 프로세서에서 실행되는 여러 스레드가 있는 경우 이 스레드 각각에는 자체 로컬 복사 리소스가 있습니다. 따라서 일부 스레드가 공통 리소스의 값을 수정하면 해당 값이 주 메모리에 매우 빠르게 반영되지 않습니다. 하지만 이 경우 다른 스레드는 공유 리소스의 현재 값을 알지 못하므로 데이터 불일치 문제가 발생합니다.

자바에는 동기화문과 동기화 방법 두 가지가 있습니다.

동기화 방식

이 경우에는 메소드 시그니처에 동기화 키워드를 추가하기만 하면 됩니다.

구문:

public synchronized return_type method_name(){}

예:

public class Demosynchronized {
private int c = 0;
public synchronized void method1() {
c++;
}
public synchronized void method2() {
c--;
}
public synchronized int method3() {
return c;
}
}

위의 예에서는 카운터를 늘리고 줄이는 것 외에는 아무것도 하지 않지만 메서드에 동기화 키워드를 도입해야 데이터 불일치가 발생하지 않고 모든 스레드가 업데이트된 값을 받게 됩니다.

따라서 첫 번째 스레드가 method1()에서 처리를 수행할 때 다른 모든 스레드는 차단(일시 중지)됩니다. 작업 스레드가 이미 개체의 잠금을 획득할 때까지 다른 스레드는 동일한 개체에 액세스할 수 없습니다. 이것이 데이터의 불일치를 방지하는 방법입니다.

또한 이제 스레드가 method1()에 대한 작업을 완료할 때마다, 즉 메서드 실행이 완료될 때마다 다른 스레드와의 관계를 설정하여 개체 값이나 상태의 변경 사항을 볼 수 있는 기능이 더 많아졌습니다. 다른 스레드에도 적용됩니다.

동기화된 문

구문:

synchronized(){}

예:

public void demo(String namestr) {
synchronized(this) {
lastName = namestr;
count++;
}
list.add(namestr);
}

위의 예에는 데이터를 관리할 동기화된 블록이 있습니다. namestr과 마찬가지로 deco() 메소드에 의해 동기화됩니다. 이는 우리가 동기화하려는 데이터를 의미합니다. 이 블록에만 배치하면 됩니다.

따라서 동일한 객체에 쓰고 읽는 두 개의 스레드가 있는 경우, 이는 읽기 및 쓰기 목적으로 동일한 객체에 액세스하는 여러 스레드가 있음을 의미하며, 다음을 제공하지 않기 때문에 위반 키워드로 가야 합니다. 다른 스레드가 실행을 중지하지 않는 한 스레드 차단을 보장하므로 이 경우 다음과 같은 위반 키워드에 대한 추가 기능을 제공하므로 동기화를 진행해야 합니다.

메소드 및 명령문 블록과 함께 사용할 수 있습니다. 즉, 전체 메소드를 동기화할 필요가 없습니다. 동기화하려는 코드를 블록 내부에 작성할 수도 있습니다.

휘발성 변수의 값을 읽거나 쓸 때 메인 메모리에 값을 직접 읽거나 쓰는데 이는 좋은 습관이 아니며 캐시에 비해 비용도 많이 듭니다. 따라서 휘발성 키워드를 사용하기 전에 생각해 보십시오. 이는 귀하의 성과에 직접적인 영향을 미칩니다.

이 경우 휘발성 키워드를 사용하기 위해 읽기와 쓰기가 서로 독립적이라는 의미인 서로의 응답에 의존하지 않는 여러 스레드가 있다고 가정합니다. 하지만 아래에 설명된 휘발성 키워드를 사용하는 것이 적합하지 않은 경우가 하나 더 있습니다.

Suppose thread has generated the first value of the volatile variable, and this current value will be used further to generate the new volatile variable values; in this case, this volatile keyword is not a good fit to generate the correct result; this condition will lead to a race condition were all thread going to read the same value but generate the new value for them and write the value to main memory and override each other values, so this will leads to the wrong result, or we can say data inconsistency issue, so here volatile keyword is not good enough to avoid this case we have to move to synchronization where we have to types to make our code synchronized, i.e. synchronized method and synchronized statement.

Example

Code:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TvvApplication {
private static final Logger LOGGER = LoggerFactory.getLogger(TvvApplication.class);
private static final Object aclock = new Object();
private static final Object aclock1 = new Object();
private static volatile int MY_INT = 0;
public static void main(String[] args) {
System.out.println("without block");
System.out.println("with block calling static method :: ");
testBlock();
}
static void testBlock1() {
synchronized (aclock1) {
MY_INT = MY_INT + 1;
System.out.println( Thread.currentThread().getName() +"new lock we create and printing voilatile value using block for block one:: "+ MY_INT);
}
}
static void testBlock() {
synchronized (aclock) {
MY_INT = MY_INT + 1;
System.out.println( Thread.currentThread().getName() +"new lock we create and printing voilatile value using block for block two:: "+ MY_INT);
}
}
}

Output :

<img src="https://img.php.cn/upload/article/000/000/000/172500598784733.png" alt="자바의 휘발성 키워드" >

Conclusion

So this can provide thread safety when data does not depend on each other; if data depends, we should go for synchronization.

위 내용은 자바의 휘발성 키워드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.