자바 병렬 프로 그래 밍 동기 화
3668 단어 자바병렬 프로 그래 밍
synchronized (class) 는 매우 특별 합 니 다. 다른 스 레 드 는 class 를 Monitor 로 가 져 올 곳 에서 기다 릴 수 있 습 니 다. class 와 this 를 다른 모니터 로 사용 할 수 있 습 니 다. 하나의 스 레 드 가 class 를 가 져 오지 않 으 면 다른 스 레 드 는 이 class 의 인 스 턴 스 를 가 져 올 수 없습니다.
[list]
synchronized(class)
synchronized(this)
synchronized(this)
synchronized(this)
synchronized(class)
synchronized(class)
[/list]
===============================================================================
이어서 synchronized 가 코드 에 미 치 는 영향 에 대해 토론 합 니 다.
P1, P2 가 같은 유형의 서로 다른 대상 이 라 고 가정 하면 이 유형 에서 다음 과 같은 몇 가지 상황 의 동기 화 블록 이나 동기 화 방법 을 정의 하면 P1, P2 는 모두 이 를 호출 할 수 있다.
1. synchronized 를 함수 수정자 로 사용 할 때 예제 코드 는 다음 과 같다.
Public synchronized void methodAAA()
{
//….
}
이것 이 바로 동기 화 방법 입 니 다. 이때 synchronized 가 잠 긴 대상 은 무엇 입 니까?그것 이 잠 긴 것 은 이 동기 화 방법 대상 을 호출 하 는 것 이다.즉, 대상 P1 이 서로 다른 스 레 드 에서 이 동기 화 방법 을 실행 할 때 이들 은 서로 배척 하고 동기 화 효 과 를 거 둘 수 있다 는 것 이다.하지만 이 대상 이 속 한 Class 에 의 한 다른 대상 P2 는 이 를 임의로 호출 할 수 있 습 니 다.
synchronized 키워드 방법.
위의 예제 코드 는 다음 과 같은 코드 와 같 습 니 다.
public void methodAAA()
{
synchronized (this) // (1)
{
//…..
}
}
(1) 처 의 this 가 가리 키 는 것 은 무엇 입 니까?그것 은 P1 과 같은 이 방법 을 사용 하 는 대상 을 말한다.이 를 통 해 알 수 있 듯 이 동기 화 방법 은 실질 적 으로 synchronized 를 object reference 에 작용 하 는 것 이다.그것 은 P1 대상 자물쇠 의 스 레 드 를 받 아야 P1 의 동기 화 방법 을 호출 할 수 있 습 니 다. P2 에 있어 P1 이라는 자 물 쇠 는 그것 과 무관 합 니 다. 프로그램 도 이런 상황 에서 동기 화 체제 의 통 제 를 벗 어 나 데이터 혼란 을 초래 할 수 있 습 니 다. (
2. 동기 블록, 예제 코드 는 다음 과 같다.
public void method3(SomeObject so)
{
synchronized(so)
{
//…..
}
}
이 때 자 물 쇠 는 so 라 는 대상 입 니 다. 이 자 물 쇠 를 가 져 온 사람 이 제어 하 는 코드 를 실행 할 수 있 습 니 다. 명확 한 대상 이 자물쇠 로 있 을 때 프로그램 을 이렇게 쓸 수 있 습 니 다. 그러나 명확 한 대상 이 자물쇠 로 되 어 있 지 않 고 코드 를 동기 화하 고 싶 을 때 특수 한 intance 변 수 를 만 들 수 있 습 니 다.
class Foo implements Runnable
{
private byte[] lock = new byte[0]; // 特殊的instance变量
Public void methodA()
{
synchronized(lock) { //… }
}
//…..
}
주: 0 길이 의 byte 배열 대상 을 만 들 면 그 어떠한 대상 보다 경제적 입 니 다. 컴 파일 된 바이트 코드 를 봅 니 다. 0 길이 의 byte [] 대상 을 만 들 려 면 3 개의 조작 코드 만 필요 하고 Object lock = new Object () 는 7 줄 의 조작 코드 가 필요 합 니 다.
3. synchronized 를 static 함수 에 사용 합 니 다. 예제 코드 는 다음 과 같 습 니 다.
Class Foo
{
public synchronized static void methodAAA() // 同步的static 函数
{
//….
}
public void methodBBB()
{
synchronized(Foo.class) // class literal(类名称字面常量)
}
}
코드 에 있 는 methodBBB () 방법 은 classliteral 을 잠 금 으로 하 는 경우 입 니 다. 동기 화 된 static 함수 와 같은 효과 가 있 습 니 다. 잠 금 은 매우 특별 합 니 다. 현재 이 방법 을 호출 하 는 대상 이 속 한 클래스 (Class, 더 이상 이 Class 에서 발생 하 는 구체 적 인 대상 이 아 닙 니 다) 입 니 다.
'Effective Java' 라 는 책 에서 Foo. class 와 P1. getClass () 를 동기 화 잠 금 으로 사용 하 는 것 을 본 적 이 있 습 니 다. P1. getClass () 로 이 Class 를 잠 그 는 목적 을 달성 할 수 없습니다. P1 은 Foo 류 에서 발생 하 는 대상 을 말 합 니 다.
[/list]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.