자바 의 Synchronized 키워드 학습 가이드(전면&상세)
6289 단어 자바synchronized키워드
자바 에서 자주 무시 되 지만 매우 중요 한 키워드 Synchronized 가 있 습 니 다.오늘 은 자바 키워드 Synchronized 의 모든 지식 을 자세히 설명 하 겠 습 니 다.좋아 하 시 길 바 랍 니 다.
목차
1.정의
자바 의 키워드 1 개
2.역할
동기 화 된 수식 방법/코드 를 같은 시간 에 최대 1 개의 스 레 드 만 실행 하도록 보장 합 니 다.
다른 스 레 드 는 현재 스 레 드 가 이 방법/코드 블록 을 실행 한 후에 야 이 방법/코드 블록 을 실행 할 수 있 습 니 다.
3.응용 장면
스 레 드 안전 을 확보 하고 다 중 스 레 드 중의 동시 다발 문 제 를 해결 합 니 다(차단 형 동시 다발 을 실현 합 니 다).구체 적 인 장면 은 다음 과 같 습 니 다.
인 스 턴 스 방법/코드 블록 을 수식 할 때(동기 화)는 같은 대상 방법의 호출&현재 인 스 턴 스 대상 이 정적 방법/코드 블록 을 수식 할 때(동기 화)는 정적 방법의 호출&class 클래스 대상 을 보호 합 니 다.
4.원리
JVM 에 의존 하여 동기 화 바 텀 을 하나의 모니터 대상(monitor)을 통 해 완성 하고 wait(),notify()등 방법 도 monitor 대상 에 의존 합 니 다.
모니터 잠 금(monitor)의 본질은 바 텀 운영 체제 의 상호 배척 잠 금(Mutex Lock)실현 에 의존한다.
5.구체 적 사용
Synchronized 는 코드 블록,클래스 의 인 스 턴 스 방법&정적 방법 을 수식 하 는 데 사 용 됩 니 다.
5.1 사용 규칙
5.2 자물쇠 의 유형&등급 은 Synchronized 가 코드 블록,클래스 의 인 스 턴 스 방법&정적 방법 을 수식 하기 때문에 서로 다른 자물쇠 의 유형 으로 나 뉘 는데 구체 적 으로 다음 과 같다.
사이 의 차이
5.3 사용 방식
/**
*
*/
public class Test{
// : 1( )
public synchronized void Method1(){
System.out.println(" ");
try{
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace();
}
}
// : 2( )
public void Method2(){
synchronized (this){
System.out.println(" ");
try{
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
/**
* ( 1)
*/
public synchronized void Method1(){
System.out.println(" ");
try{
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace();
}
}
/**
*
*/
public class Test{
// : 1 :
public static synchronized void Method1(){
System.out.println(" ");
try{
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace();
}
}
// : 2 :
public void Method2(){
synchronized (Test.class){
System.out.println(" ");
try{
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
5.4 각별히 주의Synchronized 수식 방법 에 결함 이 있 습 니 다.큰 방법 하 나 를 수식 하면 효율 에 큰 영향 을 줄 수 있 습 니 다.
예시
Synchronized 키 워드 를 사용 하여 스 레 드 류 의 run()을 수식 하면 run()은 스 레 드 의 전체 수명 내 에 계속 실행 되 기 때문에 이러한 종류의 어떠한 Synchronized 방법 에 대한 호출 도 성공 하지 못 할 것 입 니 다.
해결 방안
Synchronized 키워드 성명 코드 블록 사용 하기
이 해결 방안 은 유연성 이 높다.임의의 코드 블록&잠 금 대상 을 임의로 지정 할 수 있다.
synchronized(syncObject) {
//
// syncObject( )
}
6.특징주:원자 성,가시 성,질서 성의 정의
7.기타 제어 병행/스 레 드 동기 화 방식
7.1 Lock,ReentrantLock 안내
구별
7.2 CAS
7.2.1 정의
compare And Swap,즉 비교 및 교환 은 병행 작업 을 해결 하 는 낙관적 인 자물쇠 입 니 다.
synchronized 잠 긴 코드 블록:같은 시간 에 하나의 스 레 드 로 만 접근 할 수 있 으 며 비관 적 인 잠 금 에 속 합 니 다.
7.2.2 원리
// CAS
(A)
(B)
(C)
// CAS :
// 1. A、B, , A C、 True; , false;
// 2. ,
//
public boolean compareAndSwap(long memoryA, int oldB, int newC){
if(memoryA.get() == oldB){
memoryA.set(newC);
return true;
}
return false;
}
7.2.3 장점자원 소모 가 적 음:synchronized 에 비해 스 레 드 를 걸 고 스 레 드 를 복원 하 는 비용 을 절약 합 니 다.
그러나 업데이트 가 늦 어 지면 순환 은 CPU 자원 에 도 낭비 된다.
7.2.4 구체 적 인 실현 방식 은 CAS 를 사용 하여'먼저 검사 한 후에 실행'하 는 조작 이 있 는데 이런 조작 은 자바 에서 전형 적 인 안전 하지 않 은 조작 이기 때문에 CAS 는 실제 적 으로 C++에서 CPU 명령 을 호출 하여 실현 하 는 구체 적 인 과정 이다.
// 1. CAS Java Unsafe
// 2. Unsafe C++
// 3. CAS C++ Atomic::cmpxchg
7.2.5 전형 적 인 응용:AtomicIntegeri++와 iC 에 대해 서 는 compare AndSet&하나의 순환 을 통 해 이 루어 집 니 다.
반면
compareAndSet
함수 내부=jni
조작CAS
명령 을 통 해.CAS 작업 이 성공 할 때 까지 순환 을 뛰 어 넘 습 니 다.
private volatile int value;
/**
* Gets the current value.
*
* @return the current value
*/
public final int get() {
return value;
}
/**
* Atomically increments by one the current value.
*
* @return the previous value
*/
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
/**
* Atomically decrements by one the current value.
*
* @return the previous value
*/
public final int getAndDecrement() {
for (;;) {
int current = get();
int next = current - 1;
if (compareAndSet(current, next))
return current;
}
}
8.총화본 고 는 주로 자바 에서 자주 무시 되 지만 매우 중요 한 키워드 인 Synchronized 에 대해 설명 한다.
자바 의 Synchronized 키워드 학습 안내서 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.자바 의 Synchronized 키워드 에 관 한 더 많은 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.