volatile와synchronized 비교

1874 단어 synchronized
volatile 키워드는 무슨 소용이 있습니까?
아마volatile과synchronized의 차이를 비교해 보면 가장 명확하게 설명하기 쉽다.volatile는 변수 수식자이고synchronized는 코드나 방법에 작용한다.다음 세 마디 get 코드를 보십시오

int i1;              int geti1() {return i1;} 
volatile int i2;              int geti2() {return i2;} 
         int i3; synchronized int geti3() {return i3;}

geti1 () 은 현재 라인에 저장된 i1의 수치를 가져옵니다.여러 라인에 여러 개의 i1 변수 복사본이 있고, 이 i1들은 서로 다를 수 있다.다시 말하면, 다른 라인이 라인 내의 i1 값을 바꿨을 수도 있고, 이 값은 현재 라인의 i1 값과 같지 않을 수도 있다.사실 자바에는'주'메모리 영역이라는 사상이 있는데 여기에 변수의 현재'정확한 값'을 저장한다.모든 스레드는 자신의 변수를 복사할 수 있으며, 이 변수 복사 값은 '메인' 메모리 영역에 저장된 것과 다르다.따라서 실제적으로'주'메모리 구역의 i1값은 1이고 라인 1의 i1값은 2이며 라인 2의 i1값은 3이다. 이것은 라인 1과 라인 2가 각자의 i1값을 바꾸었고 이 변화가'주'메모리 구역이나 다른 라인에 전달되지 않았을 때 발생할 수 있다.
geti2 () 는 '주' 메모리 영역의 i2 수치를 얻을 수 있습니다.volatile로 수식된 변수는 '주' 메모리 영역과 다른 변수 복사를 허용하지 않습니다.다시 말하면 하나의 변수가volatile로 수식된 후에 모든 라인에서 동기화되어야 한다.모든 스레드에서 그 값이 바뀌었고, 모든 다른 스레드는 즉시 같은 값을 얻었다.당연히volatile 수식의 변수 접근은 일반 변수가 소모하는 자원보다 조금 많다. 왜냐하면 라인에 자신의 변수 복사가 있기 때문이다.
volatile 키워드가 라인 간 데이터 동기화를 실현한 이상 또synchronized는 무엇을 합니까?허허, 그것들 사이에는 두 가지 차이가 있다.먼저synchronized는 모니터를 얻고 방출합니다. 만약 두 라인이 같은 대상 자물쇠를 사용한다면, 모니터는 코드 블록이 한 라인에서만 동시에 실행될 수 있도록 강제로 보장할 수 있습니다. 이것은 모두가 알고 있는 사실입니다.그러나synchronized도 메모리를 동기화합니다. 사실상synchronized는 '메인' 메모리 영역에서 전체 라인의 메모리를 동기화합니다.따라서 geti3 () 방법을 실행하는 방법은 다음과 같습니다.
1. 스레드는 감시this 대상의 대상 자물쇠를 요청합니다(자물쇠가 잠기지 않았다고 가정하지 않으면 스레드가 자물쇠가 풀릴 때까지 기다립니다)
2. 스레드 메모리의 데이터가 제거되고'주'메모리 영역에서 읽기(Java 가상 기능 최적화 이 단계)
3. 코드 블록이 실행됨
4. 변수의 변경 사항은 현재 '주' 메모리 영역에 안전하게 쓸 수 있습니다. (단 geti3 () 방법은 변수 값을 바꾸지 않습니다.)
5. 스레드 방출 감시this 대상의 대상 자물쇠
따라서volatile는 루트 메모리와 '메인' 메모리 사이에서 변수의 값을 동기화할 뿐,synchronized는 어떤 모니터를 잠그고 잠금해제함으로써 모든 변수의 값을 동기화합니다.분명히 synchronized는volatile보다 더 많은 자원을 소모한다.

좋은 웹페이지 즐겨찾기