이 글은 자바 멀티스레딩에서 휘발성과 동기화의 사용법을 예제와 함께 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 구현 방법은 다음과 같습니다.
package com.chzhao; public class Volatiletest extends Thread { private static int count = 0; public void run() { count++; } public static void main(String[] args) { Thread threads[] = new Thread[10000]; for (int i = 0; i < threads.length; i++) { threads[i] = new Volatiletest(); } for (int i = 0; i < threads.length; i++) { threads[i].start(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count); } }
코드는 위와 같습니다. 예상 출력은 10000입니다. 그러면 count++는 스레드로부터 안전하지 않기 때문에 출력이 10000보다 작은 경우가 많습니다.
이 문제를 해결하기 위해 휘발성 키워드를 추가했습니다.
package com.chzhao; public class Volatiletest extends Thread { private volatile static int count = 0; public void run() { count++; } public static void main(String[] args) { Thread threads[] = new Thread[10000]; for (int i = 0; i < threads.length; i++) { threads[i] = new Volatiletest(); } for (int i = 0; i < threads.length; i++) { threads[i].start(); } try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count); } }
수정 후 10000이 아닌 값이 출력되는 경우가 많습니다.
은 동기화된 형태로 수정되었으며 코드는 다음과 같습니다.
package com.chzhao; public class SynchronizedTest extends Thread { private static int count = 0; public void run() { synchronized (LockClass.lock) { count++; } } public static void main(String[] args) { Thread threads[] = new Thread[10000]; for (int i = 0; i < threads.length; i++) { threads[i] = new SynchronizedTest(); } for (int i = 0; i < threads.length; i++) { threads[i].start(); } try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count); } }
package com.chzhao; public class LockClass { public static byte[] lock = new byte[0]; }
이 수정 후 출력은 10000입니다.
이것은 휘발성 키워드는 전혀 쓸모가 없나요? 동기화만이 스레드 안전성을 보장할 수 있습니까?
참고:
Java 언어에는 두 가지 내장 동기화 메커니즘, 즉 동기화된 블록(또는 메소드)과 휘발성 변수가 포함되어 있습니다. 두 가지 메커니즘 모두 코드 스레드 안전성을 달성하기 위해 제안되었습니다. 휘발성 변수는 동기화 수준이 낮고(때때로 더 간단하고 비용이 저렴함) 사용 시 오류가 발생하기 쉽습니다. Java 언어의 휘발성 변수는 동기화된 블록에 비해 "덜 동기화된" 것으로 간주할 수 있습니다. 휘발성 변수는 코딩이 덜 필요하고 런타임 오버헤드가 적지만 기능은 동기화의 일부일 뿐입니다.
즉, 어떤 경우에는 동기화보다 휘발성이 더 사용하기 편리하지만, 물론 동기화가 더 안 좋은 경우도 있습니다.
이 글이 모든 분들의 Java 프로그래밍에 도움이 되기를 바랍니다.
Java 멀티스레딩에서 휘발성 및 동기화 사용 분석과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!