아래 편집기에서는 휘발성이 Java에서 스레드 안전성을 보장할 수 없다는 기사를 제공합니다(예제 설명). 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리고자 합니다. 에디터를 따라가서 살펴보겠습니다
오늘은 Java의 휘발성 키워드가 스레드 안전성을 보장할 수 있는지 코딩하고 연구했습니다. 실습 후에는 휘발성이 스레드 안전성만 보장할 수는 없습니다. 캐시 대신 메인 메모리에서 데이터를 읽어오는데 다음과 같이 코드가 첨부됩니다. 동기화가 제거되면 각 스레드의 결과가 지저분해집니다. 업로드하면 결과가 정확해집니다.
/** * * 类简要描述 * * <p> * 类详细描述 * </p> * * @author think * */ public class VolatileThread implements Runnable { private volatile int a = 0; @Override public void run() { // TODO Auto-generated method stub // synchronized (this) { a = a + 1; System.out.println(Thread.currentThread().getName() + ":----" + a); try { Thread.sleep(100); a = a + 2; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":----" + a); // } } }
/** * * 类简要描述 * * <p> * 类详细描述 * </p> * * @author think * */ public class VolatileMain { public static void main(String[] args) { VolatileThread s = new VolatileThread(); Thread t1 = new Thread(s); Thread t2 = new Thread(s); Thread t3 = new Thread(s); Thread t4 = new Thread(s); t1.start(); t2.start(); t3.start(); t4.start(); /* 同步的结果 Thread-2:----1 Thread-2:----3 Thread-0:----4 Thread-0:----6 Thread-3:----7 Thread-3:----9 Thread-1:----10 Thread-1:----12*/ /* 去掉同步的结果 Thread-0:----1 Thread-1:----2 Thread-2:----3 Thread-3:----4 Thread-0:----8 Thread-3:----10 Thread-1:----10 Thread-2:----12*/ } }
위 내용은 Java에서 휘발성이 스레드 안전성을 보장할 수 없는 문제에 대한 설명 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!