6:synchronized 키워드 사용법

1914 단어
키워드synchronized의 역할은 라인 간의 동기화를 실현하는 것이다.그것의 작업은 동기화 코드에 자물쇠를 채워서 매번 하나의 라인만 동기화 블록에 들어가 라인 간의 안전성을 확보하는 것이다.
synchronized는 여러 가지 용법이 있는데, 다음은 자주 사용하는 세 가지 방식이다.
4
  • 잠금 대상 지정: 주어진 대상에 잠금을 가하고 동기화 코드에 들어가기 전에 활성화해야 하는 주어진 대상의 잠금

  • 4
  • 실례적인 방법에 직접적으로 작용한다. 현재의 실례에 자물쇠를 채우는 것과 같다. 동기화 코드에 들어가기 전에 현재의 실례적인 자물쇠를 얻어야 한다

  • 4
  • 정적 방법에 직접적으로 작용한다. 현재 클래스에 자물쇠를 채우는 것과 같다. 동기화 코드에 들어가기 전에 현재 클래스의 자물쇠를 획득해야 한다

  • 예 1(객체 잠금):
    /**
     * Created by zhangjianghong on 2017/8/1.
     */
    public class SynClass implements Runnable{
        static int i = 0;
        static SynClass synClass = new SynClass();
    
        @Override
        public void run() {
            for (int j = 0; j < 10000; j++) {
               // synchronized (synClass){
                    i++;
               // }
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            Thread t1 = new Thread(synClass);
            Thread t2 = new Thread(synClass);
    
            t1.start();
            t2.start();
            t1.join();
            t2.join();
            System.out.println(i);
        }
    }
    

    코드에 주석된 코드 내용에 주의하십시오. 이 때의 운행 결과는 항상 20000보다 적습니다. 왜냐하면 두 라인이 i가 자증할 때마다 얻은 값이 최신 값이 아니기 때문에 라인에 혼란이 생겼습니다. (즉volatile를 사용해도 무효입니다.volatile는 조작에 부합되는 원자성을 보장할 수 없기 때문입니다.)주석을 놓으면 매번 얻는 값은 20000이다.물론 우리는 상기 코드를 다음과 같이 수정할 수 있다(방법 잠금,main방법 생략)도 정확한 결과를 얻을 수 있다.
    public class SynClass implements Runnable{
        static volatile int i = 0;
        static SynClass synClass = new SynClass();
    
    
        public synchronized void  add (){
            for (int j = 0; j < 10000; j++) {
                i ++;
            }
        }
    
        @Override
        public void run() {
            add();
        }
    }
    

    클래스 잠금(main 메서드 생략):
      @Override
        public void run() {
            for (int j = 0; j < 10000; j++) {
                synchronized (SynClass.class){
                    i++;
                }
            }
        }
    

    좋은 웹페이지 즐겨찾기