자바 synchronized 키워드 와 Lock 인터페이스 실현 원리

이 글 은 자바 synchronized 키워드 와 Lock 인터페이스 실현 원 리 를 소개 합 니 다.
인용 하 다.
개발 과정 에서 우 리 는 병발 문 제 를 만 났 다.어떻게 해결 합 니까?
간단 하고 거 친 해결 방법:잠 금.천 군 만 마 를 모두 막 고 한 사람 만 외 나무 다 리 를 건 널 수 있 도록 허락 하 다.서면 은 병행 하 는 절 차 를 직렬 로 바 꾸 는 절차 라 는 뜻 이다.현실 의 자 물 쇠 는 자물쇠,자물쇠,서랍 자물쇠 등 이 있다.자바 에서 우리 의 자 물 쇠 는 synchronized 키워드 와 Lock 인터페이스 입 니 다.
synchronized 키워드
synchronized 도 동기 자물쇠 라 고 하 는데 자바 의 키워드 입 니 다.synchronized 원리 도 JVM 가상 컴퓨터 와 관련 이 있다 고 추측 할 수 있 습 니 다.
synchronized 자 물 쇠 는 대상 입 니 다.대상 안 에는 감시 자물쇠(monitor)라 는 것 이 있 는데 감시 자 물 쇠 는 운영 체제 의 상호 배척 자물쇠(Mutex Lock)에 의존한다.운영 체제 전환 스 레 드 는 사용자 상태 프로 그래 밍 핵심 상태(cpu 의 두 가지 상태)입 니 다.이 대 가 는 좀 높 기 때문에 synchronized 라 는 중량급 자물쇠 뒤에 도 편향 자물쇠 와 경량급 자물쇠 가 도입 되 었 다.
잠 금 추가(잠 금 모니터 감시)프로 세 스 분석():
  • Monitor 의 진입 수 는 0 이 고 스 레 드 A 진입
  • monitor 의 진입 수 는 1
  • 이다.
  • 스 레 드 B 가 이 Monitor 에 들 어 가 려 고 하면 차단 된다.
  • 스 레 드 A 는 이 Monitor 에 반복 적 으로 들 어 갈 수 있 기 때문에 synchronized 는 잠 금 을 다시 들 어 갈 수 있 고 Lock 이 실현 하 는 자물쇠 와 같 습 니 다.
    프로그램 검증
    
    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 키워드 로 수식 되 어 있 습 니 다.클래스 대상 입 니 다.클래스 대상 이 아니라면 어떻게 되 는 지 생각해 보 세 요.바로 연쇄 자물쇠 입 니 다.

    모든 스 레 드 는 열쇠 로 이 자 물 쇠 를 풀 수 있 고 프로그램 에 있어 서 자 물 쇠 를 넣 는 작업 은 의미 가 없다.우리 에 게 필요 한 것 은 자물쇠 이기 때문이다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기