자바 의 synchronized 키워드:동기 화 메커니즘 요약
자바 의 synchronized 키워드:동기 화 메커니즘 요약
JAVA 에서 synchronized 키 워드 는 함수 의 수정자 로 도 사용 할 수 있 고 함수 내의 구문 으로 도 사용 할 수 있 습 니 다.즉,평소에 말 하 는 동기 화 방법 과 동기 화 구문 블록 입 니 다.synchronized 가 잠 긴 대상 이 무엇 인지 알 아내 면 더 안전 한 다 중 스 레 드 프로그램 을 설계 하 는 데 도움 을 줄 수 있 습 니 다.
AD: 51CTO 클 라 우 드 컴 퓨 팅 구조 사 정상 회의 티켓 팅 진행 중!
얼마 전에 동기 화 를 사 용 했 는데 지금 은 고 개 를 돌려 JAVA 의 동기 화 에 대해 정 리 를 하여 얼마 전의 업무 총화 와 자기 기술 에 대한 조리 있 는 말 을 한다.JAVA 의 synchronized 키 워드 는 함수 의 수정자 로 도 사용 할 수 있 고 함수 내의 구문 으로 도 사용 할 수 있 습 니 다.즉,평소에 말 하 는 동기 화 방법 과 동기 화 구문 블록 입 니 다.만약 에 더 자세 한 분 류 를 한다 면 synchronized 는 instance 변수,object reference(대상 참조),static 함수 와 class literals(클래스 이름 글자 상수)에 작용 할 수 있 습 니 다. 진일보 한 논술 을 하기 전에 우 리 는 몇 가 지 를 명확 하 게 해 야 한다. A.synchronized 키 워드 를 방법 에 추가 하 든 대상 에 추가 하 든 그 가 얻 은 자 물 쇠 는 모두 대상 이지 코드 나 함 수 를 자물쇠 로 하 는 것 이 아니 라 동기 화 방법 은 다른 스 레 드 의 대상 에 게 접근 할 수 있 습 니 다. B.대상 마다 하나의 자물쇠(lock)만 연결 되 어 있 습 니 다. C.동기 화 를 실현 하 는 데 는 많은 시스템 비용 을 대가 로 하고 심지어 잠 금 을 초래 할 수 있 기 때문에 불필요 한 동기 화 통 제 를 최대한 피해 야 한다. 이어서 synchronized 가 코드 에 미 치 는 영향 에 대해 토론 합 니 다.
P1,P2 가 같은 유형의 서로 다른 대상 이 라 고 가정 하면 이 유형 에서 다음 과 같은 몇 가지 상황 의 동기 화 블록 이나 동기 화 방법 을 정의 하면 P1,P2 는 모두 그들 을 호출 할 수 있다.
자바 의 synchronized 사용 방법 요약
1. synchronized 를 함수 수정자 로 사용 할 때 예제 코드 는 다음 과 같 습 니 다.
- Public synchronized void method(){
- //….
- }
이것 이 바로 동기 화 방법 입 니 다.이때 synchronized 가 잠 긴 대상 은 무엇 입 니까?그 가 잠 근 것 은 이 동기 화 방법의 대상 을 호출 하 는 것 이다.즉,대상 P1 이 서로 다른 스 레 드 에서 이 동기 화 방법 을 실행 할 때 그들 은 서로 배척 하고 동기 화 효 과 를 거 둘 수 있다 는 것 이다.그러나 이 대상 이 속 한 클 라 스 가 만 든 다른 대상 P2 는 synchronized 키 워드 를 추가 한 방법 을 임의로 호출 할 수 있 습 니 다. 위의 예제 코드 는 다음 과 같은 코드 와 같 습 니 다.
- public void method()
- {
- synchronized (this) // (1)
- {
- //…..
- }
- }
(1)처 의 this 가 가리 키 는 것 은 무엇 입 니까?그 가 가리 키 는 것 은 바로 이 방법 을 호출 하 는 대상 이다.예 를 들 어 P1.이 를 통 해 알 수 있 듯 이 동기 화 방법 은 실질 적 으로 synchronized 를 object reference 에 작용 하 는 것 이다.그것 은 P1 대상 의 자 물 쇠 를 가 져 와 야 P1 의 동기 화 방법 을 호출 할 수 있 고 P2 에 있어 P1 이라는 자 물 쇠 는 그 와 무관 하 며 프로그램 도 이런 상황 에서 동기 화 체제 의 통 제 를 벗 어 나 데이터 혼란 을 초래 할 수 있다.
2.동기 블록,예제 코드 는 다음 과 같다.
- public void method(SomeObject so) {
- synchronized(so)
- {
- //…..
- }
- }
이때 자 물 쇠 는 바로 so 라 는 대상 이다.이 자 물 쇠 를 가 진 사람 이 그 가 제어 하 는 코드 를 실행 할 수 있다.명확 한 대상 이 잠 겨 있 을 때 이렇게 프로그램 을 쓸 수 있 습 니 다.그러나 명확 한 대상 이 잠 겨 있 지 않 고 코드 를 동기 화하 고 싶 을 때 특별한 intance 변 수 를 만 들 수 있 습 니 다.
- class Foo implements Runnable
- {
- private byte[] lock = new byte[0]; // instance
- Public void method()
- {
- synchronized(lock) { //… }
- }
- //…..
- }
주:0 길이 의 byte 배열 대상 을 만 들 면 그 어떠한 대상 보다 경제적 입 니 다.컴 파일 된 바이트 코드 를 봅 니 다.0 길이 의 byte[]대상 을 만 들 려 면 3 개의 조작 코드 만 필요 하고 Object lock=new Object()는 7 줄 의 조작 코드 가 필요 합 니 다.
3.synchronized 를 static 함수 에 사용 합 니 다.예제 코드 는 다음 과 같 습 니 다.
- Class Foo
- {
- public synchronized static void method1() // static
- {
- //….
- }
- public void method2()
- {
- synchronized(Foo.class) // class literal( )
- }
- }
코드 의 method 2()방법 은 class literal 을 잠 금 으로 하 는 경우 입 니 다.그 는 동기 화 된 static 함수 와 같은 효 과 를 가 집 니 다.잠 금 은 매우 특별 합 니 다.현재 이 방법 을 호출 하 는 대상 이 속 한 클래스(Class,더 이상 이 Class 에서 발생 하 는 구체 적 인 대상 이 아 닙 니 다)입 니 다. 'Effective Java'라 는 책 에서 Foo.class 와 P1.getClass()를 동기 화 자물쇠 로 사용 하 는 것 을 본 적 이 있 습 니 다.P1.getClass()로 이 Class 를 잠 그 는 목적 을 달성 할 수 없습니다.P1 은 Foo 류 에서 발생 하 는 대상 을 말한다. 추정 할 수 있 습 니 다.만약 에 하나의 클래스 에서 synchronized 의 static 함수 A 를 정의 하고 synchronized 의 intance 함수 B 를 정의 한다 면 이 유형의 같은 대상 Obj 는 다 중 스 레 드 에서 각각 A 와 B 두 가지 방법 을 방문 할 때 동기 화 되 지 않 습 니 다.왜냐하면 그들의 자물쇠 가 모두 같 지 않 기 때 문 입 니 다.A 방법의 자 물 쇠 는 Obj 가 속 한 그 Class 이 고 B 의 자 물 쇠 는 Obj 가 속 한 이 대상 이다.
자바 의 synchronized 사용 방법 요약 은 다음 과 같 습 니 다.
synchronized 가 잠 긴 대상 이 무엇 인지 알 아내 면 더 안전 한 다 중 스 레 드 프로그램 을 설계 하 는 데 도움 을 줄 수 있 습 니 다.
공유 자원 에 대한 동기 화 접근 을 더욱 안전하게 할 수 있 는 기술 이 있 습 니 다. 1. private 의 intance 변수+그의 get 방법 을 정의 합 니 다.Public/protected 의 intance 변 수 를 정의 하지 마 십시오.변 수 를 Public 로 정의 하면 대상 은 외부 에서 동기 화 방법의 통 제 를 피해 직접 그 를 얻 고 바 꿀 수 있 습 니 다.이것 도 자바 빈 의 표준 실현 방식 중의 하나 다. 2. 인 스 턴 스 변수 가 대상 이 라면 배열 이나 Array List 같은 방법 은 안전 하지 않 습 니 다.외부 대상 이 get 방법 을 통 해 이 인 스 턴 스 대상 의 인용 을 받 은 후에 다른 대상 을 가리 키 면 이 private 변수 도 변 합 니 다.위험 하지 않 습 니까?이 럴 때 get 방법 에 synchronized 동기 화 를 추가 하고 이 private 대상 의 clone()만 되 돌려 야 합 니 다.그러면 호출 단 에서 얻 은 것 은 대상 사본 의 인용 입 니 다.
본문 은 leofaith 의 블 로그.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.