자바 synchronized 키워드 와 Lock 인터페이스 실현 원리
3873 단어 자바synchronized키워드lock인터페이스
인용 하 다.
개발 과정 에서 우 리 는 병발 문 제 를 만 났 다.어떻게 해결 합 니까?
간단 하고 거 친 해결 방법:잠 금.천 군 만 마 를 모두 막 고 한 사람 만 외 나무 다 리 를 건 널 수 있 도록 허락 하 다.서면 은 병행 하 는 절 차 를 직렬 로 바 꾸 는 절차 라 는 뜻 이다.현실 의 자 물 쇠 는 자물쇠,자물쇠,서랍 자물쇠 등 이 있다.자바 에서 우리 의 자 물 쇠 는 synchronized 키워드 와 Lock 인터페이스 입 니 다.
synchronized 키워드
synchronized 도 동기 자물쇠 라 고 하 는데 자바 의 키워드 입 니 다.synchronized 원리 도 JVM 가상 컴퓨터 와 관련 이 있다 고 추측 할 수 있 습 니 다.
synchronized 자 물 쇠 는 대상 입 니 다.대상 안 에는 감시 자물쇠(monitor)라 는 것 이 있 는데 감시 자 물 쇠 는 운영 체제 의 상호 배척 자물쇠(Mutex Lock)에 의존한다.운영 체제 전환 스 레 드 는 사용자 상태 프로 그래 밍 핵심 상태(cpu 의 두 가지 상태)입 니 다.이 대 가 는 좀 높 기 때문에 synchronized 라 는 중량급 자물쇠 뒤에 도 편향 자물쇠 와 경량급 자물쇠 가 도입 되 었 다.
잠 금 추가(잠 금 모니터 감시)프로 세 스 분석():
프로그램 검증
public class SynchronizedTest {
private static int i = 0;
public static void main(String[] args) {
test();
}
public static void test(){
synchronized (SynchronizedTest.class){
synchronized (SynchronizedTest.class){
i++;
}
}
}
}
실행 결과프로그램 이 정상적으로 운행 되 어 오류 가 발생 하지 않 았 다.
synchronized 는 방법 과 코드 블록 을 수식 할 수 있 습 니 다.코드 블록 은 바로 위 에 자 물 쇠 를 다시 넣 는 예 입 니 다.
수식 방법
public class SynchronizedTest {
static int n = 100;
final static CountDownLatch start = new CountDownLatch(n);
private static int i = 0;
public static void main(String[] args) throws InterruptedException {
for (int j = 0; j < n; j++) {
Thread thread = new Thread(new addNoSynchronized());
thread.start();
}
start.await();
System.out.println(i);
}
public static class addSynchronized implements Runnable{
@Override
public void run() {
addSynchronized();
}
public static synchronized void addSynchronized(){
for (int j = 0; j < 1000; j++) {
i++;
}
start.countDown();
}
}
}
실행 결과100000
synchronized 키 워드 를 제거 하면 실행 결 과 는 100000 이 아 닙 니 다.스 레 드 가 안전 하지 않 기 때 문 입 니 다.
잠 금 인터페이스
일반적으로 우 리 는 ReentrantLock 류 를 재 입 자물쇠 로 사용 하여 Lock 인 터 페 이 스 를 실현 합 니 다.
사용 방법
public class ReentranLockTest {
private static int j;
private static int n = 100;
private static CountDownLatch latch = new CountDownLatch(n);
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < n; i++) {
new Thread(new LockTest()).start();
}
latch.await();
System.out.println(" :"+j);
}
public static class LockTest implements Runnable{
static Lock lock = new ReentrantLock();
@Override
public void run() {
lockTest();
latch.countDown();
}
private void lockTest() {
lock.lock();
try {
for (int i = 0; i < 1000; i++) {
j++;
}
}finally {
lock.unlock();
}
}
}
}
실행 결과결과:100000
여기 우리 가 잠 겨 있 는 j++이 자원 구역(공공 자원),lock 은 static 키워드 로 수식 되 어 있 습 니 다.클래스 대상 입 니 다.클래스 대상 이 아니라면 어떻게 되 는 지 생각해 보 세 요.바로 연쇄 자물쇠 입 니 다.
모든 스 레 드 는 열쇠 로 이 자 물 쇠 를 풀 수 있 고 프로그램 에 있어 서 자 물 쇠 를 넣 는 작업 은 의미 가 없다.우리 에 게 필요 한 것 은 자물쇠 이기 때문이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.