이 기사에서는 예제를 통해 Java 멀티스레딩에서 휘발성 및 동기화의 사용법을 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 구현 방법은 다음과 같습니다.
다음과 같이 코드를 복사합니다. package com.chzhao;
공개 클래스 Volatiletest는 Thread {를 확장합니다.
개인 정적 정수 개수 = 0;
공개 무효 실행() {
카운트++;
}
공개 정적 무효 메인(String[] args) {
스레드 스레드[] = 새 스레드[10000];
for (int i = 0; i < thread.length; i++) {
스레드[i] = new Volatiletest();
}
for (int i = 0; i < thread.length; i++) {
스레드[i].start();
}
노력하다 {
Thread.sleep(1000);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
System.out.println(count);
}
}
코드는 위와 같습니다. 예상되는 출력은 10000입니다. 그러나 count++는 스레드로부터 안전하지 않기 때문에 출력이 10000보다 작은 경우가 많습니다.
이 문제를 해결하기 위해 휘발성 키워드가 추가되었습니다.
다음과 같이 코드를 복사합니다. package com.chzhao;
공개 클래스 Volatiletest는 Thread {를 확장합니다.
개인 휘발성 정적 정수 개수 = 0;
공개 무효 실행() {
카운트++;
}
공개 정적 무효 메인(String[] args) {
스레드 스레드[] = 새 스레드[10000];
for (int i = 0; i < thread.length; i++) {
스레드[i] = new Volatiletest();
}
for (int i = 0; i < thread.length; i++) {
스레드[i].start();
}
노력하다 {
Thread.sleep(2000);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
System.out.println(count);
}
}
수정 후 10000이 아닌 값이 출력되는 경우가 많습니다.
동기화된 형태로 수정하면 코드는 다음과 같습니다.
다음과 같이 코드를 복사합니다. package com.chzhao;
공개 클래스 동기화 테스트는 Thread {를 확장합니다.
개인 정적 정수 개수 = 0;
공개 무효 실행() {
동기화됨(LockClass.lock) {
카운트++;
}
}
공개 정적 무효 메인(String[] args) {
스레드 스레드[] = 새 스레드[10000];
for (int i = 0; i < thread.length; i++) {
스레드[i] = 새로운 동기화 테스트();
}
for (int i = 0; i < thread.length; i++) {
스레드[i].start();
}
노력하다 {
Thread.sleep(2000);
} 잡기(InterruptedException e) {
e.printStackTrace();
}
System.out.println(count);
}
}
다음과 같이 코드를 복사합니다. package com.chzhao;
공개 클래스 LockClass {
공개 정적 바이트[] 잠금 = 새 바이트[0];
}
이 수정 후 출력은 10000입니다.
이것은 휘발성 키워드가 전혀 쓸모가 없다는 것을 의미합니까? 동기화만이 스레드 안전성을 보장할 수 있습니까?
설명하다:
Java 언어에는 동기화된 블록(또는 메소드)과 휘발성 변수라는 두 가지 고유한 동기화 메커니즘이 포함되어 있습니다. 두 가지 메커니즘 모두 코드 스레드 안전성을 달성하기 위해 제안되었습니다. 휘발성 변수는 동기화 수준이 낮고(때때로 더 간단하고 비용이 저렴함) 사용 시 오류가 발생하기 쉽습니다. Java 언어의 휘발성 변수는 동기화된 블록에 비해 "덜 동기화된" 것으로 생각할 수 있습니다. 휘발성 변수는 코딩이 덜 필요하고 런타임 오버헤드가 적지만 기능은 동기화의 일부일 뿐입니다.
즉, 어떤 경우에는 동기화보다 휘발성이 더 사용하기 편리하지만, 물론 동기화가 더 나쁘다.
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.