>  기사  >  Java  >  Java 멀티스레딩의 휘발성 및 동기화 사용 분석

Java 멀티스레딩의 휘발성 및 동기화 사용 분석

高洛峰
高洛峰원래의
2017-01-05 16:02:511777검색

이 글은 자바 멀티스레딩에서 휘발성과 동기화의 사용법을 예제와 함께 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 구현 방법은 다음과 같습니다.

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 중국어 웹사이트를 주목하세요!


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