volatile 예제

다른 사람들이 지적했듯이이 블로그는 오해의 소지가 있습니다. 예제의 휘발성은 필드가 null이 아닌지 확인하는 것과는 아무 관련이 없습니다 (이 보증은 실제로 원래 Java 메모리 모델에서 문제를 일으킬 것입니다 – 아래 링크를 참조하십시오). 나는 “자바 휘발성”사람들이 아마 그것을 읽고 잘못된 정보를 받고 인터넷 검색하여이 블로그를 발견했다. 당신이 제공 한 예제는 휘발성 (나중에 Java 메모리 모델을 가정)의 읽기가 휘발성에 대한 이전 쓰기가 완료되었음을 보장하고, 이것은 차례로 때문에 객체가 완전히 생성된 것을 보장하기 때문에 휘발성이 필요합니다 ” 휘발성에 관한 규칙과 같은 “직렬”보존. 휘발성이 없으면 _instance를 스레드에 기록하고 해당 스레드가 완전히 생성되기 전에 로컬 메모리에서 다른 스레드로 “유출”될 수 있습니다. 영향을 받지 않습니다. 이 글을 읽고 블로그를 다시 작성해야 합니다 (또는 어쨌든 설명하는이 페이지에 대한 링크).http://www.ibm.com/developerworks/library/j-jtp03304/그것은 또한 당신이 아마 이중 확인 잠금으로 귀찮게하지 말아야 하는 이유를 설명합니다. 이 경우 스레드 1이 aVolatileVariable 값을 작성한 다음 aNonValitileVariable의 값도 주 메모리에 기록됩니다. 그리고 휘발성 변수는 아니지만 휘발성 동작을 보이고 있습니다. 안녕하세요, 귀하의 게시물에 대 한 감사 하지만 포인트 번호 3 그리고 6 “자바에서 휘발성 키워드에 중요 한 포인트” 섹션에서 모순. 내 의견으로는, 휘발성은 “가시성”을 보장하지만 원자성을 보장하지 않습니다. 긴 / 이중 변수는 원자성을 지원하지 않기 때문에 가능한 해결책은 Atomic * apis를 사용하는 것입니다.

해시 테이블 (동기화) 및 휘발성 해시 셋 (또한 동기화 된 것 같다)의 차이점을 알고 계십니까? 서틀릿 사양에 따라 컨테이너는 하나의 인스턴스를 만듭니다. 사양은 “service() 메서드를 동기화된 것으로 표시하지 마십시오. 하나의 인스턴스와 풀링, 그것은 혼란스럽다. 싱글톤에 대한 첫 번째 예제를 볼 때 싱글 톤 개체에 대한 풀링을 만드는 방법을 알고 있습니다. 휘발성 키워드는 무대 뒤의 멀티 프로세서 컴퓨터에 이 기능을 제공합니다. 감사합니다. 첫째, 게시물에 감사드립니다. 이 게시물은 매우 흥미롭습니다. 그것은 나를 다른 시나리오를 많이 연습하고 많은 것을 배웠습니다. 다음 시나리오를 테스트할 수 있었습니다:Case1: 동기화 된 블록을 사용 하 여 Singleton 생성, 휘발성 변수 하지만 이중 확인 잠금 (여러 인스턴스를 만들 1/10 번)그러나, 다음 시나리오 실행 에도 불구 하 고 단일 인스턴스를 생산 테스트 사례 여러 번Case2 : 동기화 된 블록, 휘발성 변수 및 이중 확인 lockingCase3사용 : 동기화 된 블록 및 이중 확인 잠금을 사용하지만 휘발성 변수Case2를 사용하지 않는 것은 지금 나에게 매우 분명합니다.

그러나 Case 3은 여러 번 테스트한 후 적어도 한 번은 여러 인스턴스를 생성해야 합니다. 여기에 그것을위한 코드입니다. 당신이 그것을 테스트하는 더 좋은 방법이 있다면 알려주시기 바랍니다. 싱글톤 클래스 크리에이션 패키지 휘발성;공공 클래스 싱글톤크리에이션사용휘발성 {개인 정적 싱글톤크리에이션없이휘발성 인스턴스; 개인 싱글톤크리에이션사용휘발성() { System.out.println(” 싱글톤Creation사용휘발성 생성자 호출.”); } public 정적 SingletonCreation사용하지 않고휘발성 getInstance (문자열 스레드 이름) { 경우 (인스턴스 == null) { 동기화 된 경우 (SingletonCreationWithout사용휘발성.클래스) { if (인스턴스 =null){ 인스턴스 = 새 SingletonCreation사용없이 휘발성 ); System.out.println(스레드 이름 + “이 싱글톤 클래스의 새 인스턴스를 만들었습니다.”) } } } 반환 인스턴스; }// 싱글톤 생성 동시성 테스트 패키지 휘발성;수입 java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public 클래스 싱글톤Creation사용하지 않고휘발성ConcurrencyTest { 공공 정적 보이드 메인 (문자열[] args) { //long startTime= System.nanoTime(); 카운트 다운 래치 = 새로운 카운트 다운 래치 (2); 긴 시작 시간 = 시스템.현재시간 밀리스(); 실행기서비스 실행기 = 실행기.newCachedThreadPool(); executors.execute(새 Runnable(새 Runnable() { @Override 공용 보이드 런() { {for(long i=1;i<999_999_999;i++){//System.out.println("첫 번째 실행자 스레드 수: "+i); 싱글톤크리에이션사용휘발성 스큐프 = 싱글톤크리에이션사용휘발성 .getInstance(Thread.currentThread().getName()); } 래치.카운트다운(); } }); executors.execute(새로운 Runnable(새 Runnable() { @Override 공개 무효 실행() { {for(long i=1=1;i<999_999_++){{/system.out.println("두 번째 실행자 스레드 수: "+i); 싱글톤크리에이션사용휘발성 스큐프 = 싱글톤크리에이션사용휘발성 .getInstance(Thread.currentThread().getName()); } 래치.카운트다운(); } }); 실행기.execute(새 Runnable() { @Overri