volatile 키워드를 변수앞에 쓴다는 것은 변수를 읽어들이거나 받아들일 때에
main memory에서 읽어들이고 main memory에 저장하겠다는 뜻을 갖는다.
다음과 같은 멀티 스레드 상황에서
CPU1이 Main Memory에 있는 value 값을 가져와서 +1씩 시키고 있을 때에
CPU2가 Main Memory에서 뒤늦게 value 값을 가져와서 사용할 때에 서로의 변수 값이 다르기에 오류가 발생할 수 있다.
이 때에 volatile 키워드를 사용해서 변수 앞에 붙여주면 위의 변수 값이 일치하지 않아서 생기는 오류를 해결할 수 있다.
하지만 언제나 적절한 것은 아니다. 흔한 멀티스레딩 문제의 오류가 날 수 있기 때문이다.
만약 CPU1이 Main Memory에서 부터 0의 값을 가진 count 변수를 가져와 +1를 해주고 write를 해주기 전에
CPU2가 count 변수를 가져와 +1를 해주고 write을 하려는 상황에서 기댓값은 2이지만 1이 write 될 것이다.
그렇기 때문에 이런 여러 스레드가 write 하게 되는 상황에서는 synchronized 키워드를 이용해 꼭 동기화 해주어야 한다.
Main Memory가 Cache Memory보다 비용값이 크기 때문에 위의 상황과 같은 변수 값 일치를 기대해야 할 때에만
volatile를 사용하는 것이 좋다.
'Java' 카테고리의 다른 글
Java 다익스트라 알고리즘(Dijkstra Algorithm)에 대해 (0) | 2020.09.08 |
---|---|
Java 프림 알고리즘(Prim Algorithm)과 크루스칼 알고리즘(Kruskal Algorithm)에 대해 (0) | 2020.09.07 |
위상정렬 자바로 구현하기, 백준2252_줄 세우기 (0) | 2020.08.31 |
Java Trie(트라이)란 (0) | 2020.08.27 |
Java HashMap 메서드 computeIfAbsent (0) | 2020.08.27 |