달순이
273
2017-07-17 17:48:41.0 작성 2017-07-17 18:02:56.0 수정됨
1
150

java volatile 키워드에 대해 질문있습니다.


synchronized를 뮤텍스처럼 임계 구역에서 락을 걸어 메모리를 동기화시키는 원리는 알겠습니다만...  그렇다면 volatile은 왜 필요하고, 어느 상황에서 쓰이는거죠??


여러 블로그에서 다음 글을 읽었는데요... 

"volatile 변수 접근까지에 대해 모든 변수들의 상황이 업데이트 되고 변수가 업데이트 된다."

"volatile은 읽기/쓰기 시에 어떤 쓰레드가 값을 변경하든, 항상 최신값을 읽어갈 수 있게 해주죠..."

"Volatile은 작업의 요소를 뺀 가시성, 즉 읽기, 쓰기동작에 대해서만 동기화가 됩니다. 그리고 그것은 원자성(Atomic)을 가집니다"


두 쓰레드에서 1을 1000번씩 더하는 다음 코드에서 AAA 쓰레드가 위의 volatile의 원리대로 count을 업데이트 시키면 BBB는 업데이트된 count를 가지고 연산하고 AAA도 다시 업데이트된 count를 가지고 연산하면 최종 결과는 2000이 나올텐데... 왜 마지막 로그의 count가 2000이 안나오고 1242가 나오는건지 잘 모르겠습니다. 결국 동기화 시키려고 사용한 volatile 키워드가 있으나 마나 한 상황인데 말이죠...


synchronized도 있고 AtomicInteger도 있는데 굳이 volatile 키워드를 반드시 사용해야하는 이유와 상황이 따로 있는건가요? 


public class Volatile {

	public static void main(String[] args) {
		TestVolatile testVolatile = new TestVolatile();
		testVolatile.runCountThread("AAA");
		testVolatile.runCountThread("BBB");
	}
	
}

class TestVolatile {

	private volatile int count = 0;
	
	public void runCountThread(final String name) {
        new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 1000; i++) {
					count++;
				}
				
				System.out.println(name + " : " + count);
				// 예상 결과
				// AAA: 1000 또는 2000
				// BBB: 2000
				
				// 실제 결과
				// AAA: 1242
				// BBB: 1242
			}
        }, name).start();
    }
	
}







0
0
  • 답변 1

  • OkkyUser
    2k
    2017-07-17 17:52:50.0

    https://stackoverflow.com/questions/106591/do-you-ever-use-the-volatile-keyword-in-java

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.