Java 멀티스레드-학습노트2: Synchronized 잠금 재입력 &volatile 키워드 & ThreadLocal

3120 단어

Synchronized 잠금 재입력


Synchronized를 사용할 때, 한 라인이 대상의 자물쇠를 얻고, 이 라인에서 코드를 실행할 때, 이 대상의 자물쇠를 다시 요청하면 바로 이 대상의 자물쇠를 얻을 수 있다.한 라인이 다른 라인이 가지고 있는 자물쇠를 요청할 때, 이 라인은 막히고, 이 라인이 자신이 가지고 있는 자물쇠를 요청할 때, 이 자물쇠가 다시 잠기면 성공을 요청하고, 그렇지 않으면 막힌다.한마디로 자기 내부의 자물쇠를 얻을 수 있다.
자물쇠를 다시 넣을 수 있는 역할: 자물쇠가 사라지는 것을 최대한 피한다.

잠금 재설정 가능한 추가 기능:

  • 부자상속성
  • 이상 시 자물쇠 자동 방출
  • 단일 이익 모드 - 이중 검사 잠금
  • volatile와synchronized의 차이


    volatile 키워드의 역할: 라인의 개인 데이터 창고에서 변수의 값을 얻는 것이 아니라 공공 창고에서 변수의 값을 얻는 것을 강제합니다.
  • volatile는 라인 동기화의 경량급 실현으로synchronized보다 성능이 좋고volatile는 변수만 수식할 수 있으며synchronized는 코드 블록을 수식할 수 있는 방법 등이다.
  • 다중 루틴 접근volatile는 막히지 않으며,synchronized에 접근하면 막힌다
  • 데이터의 가시성을 보장할 수 있으나 원자성을 보장할 수 없다.synchronized는 원자성을 보장할 수 있고 간접적으로 가시성을 보장할 수 있다. 왜냐하면 그는 개인 메모리와 공공 메모리의 데이터를 동기화하기 때문이다.원자성을 보장할 수 없는 것은 라인의 안전을 보장할 수 없다는 것이다.
  • volatile는 변수가 여러 라인 사이의 가시성을 해결하고synchronized는 여러 라인 사이의 접근 자원의 동기성을 해결한다.

  • ThreadLocal 소개 및 사용


    ThreadLocal 개요


    ThreadLocal의 존재는 모든 라인에 자신의 공유 변수가 있다는 것을 해결하기 위해서이다. 이 변수는 라인의 개인적인 것이다.
    public class ThreadLocalDemo {
        public static ThreadLocal> threadLocal = new ThreadLocal<>();
        
        public void setThreadLocal(List values) {
            threadLocal.set(values);
        }
        
        public void getThreadLocal() {
            System.out.println(Thread.currentThread().getName());
            threadLocal.get().forEach(name -> System.out.println(name));
        }
        
        public static void main(String[] args) throws InterruptedException {
    
            final ThreadLocalDemo threadLocal = new ThreadLocalDemo();
            new Thread(() -> {
                List params = new ArrayList<>(3);
                params.add(" ");
                params.add(" ");
                params.add(" ");
                threadLocal.setThreadLocal(params);
                threadLocal.getThreadLocal();
            }).start();
    
            new Thread(() -> {
                try {
                    Thread.sleep(1000);
                    List params = new ArrayList<>(2);
                    params.add("Chinese");
                    params.add("English");
                    threadLocal.setThreadLocal(params);
                    threadLocal.getThreadLocal();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
    

    위의 코드에는 정적 threadLocal 속성이 있는데 두 개의 루트가 동시에 접근합니다. ThreadLocal이 수식되어 있기 때문에 서로 다른 루트가 이 루트가 설정한 값에 접근합니다.
    ThreadLocal을 사용하여 변수를 유지할 때 ThreadLocal은 이 변수를 사용하는 모든 라인에 독립된 변수 복사본을 제공하기 때문에 모든 라인은 독립적으로 자신의 복사본을 바꿀 수 있고 다른 라인에 대응하는 복사본에 영향을 주지 않는다.

    ThreadLocal과 Synchronized 동기화 메커니즘 비교


    동기화 메커니즘에서 Synchronized 개체 잠금을 통해 같은 시간에 하나의 스레드 접근 변수만 보장할 수 있습니다.이 변수는 여러 라인 사이에서 공유된다.TreadLocal은 스레드의 부분적인 변수로서 다중 스레드 간 병렬 접근 변수의 해결 방안이다.
    ThreadLocal은 자물쇠를 전혀 제공하지 않고 공간을 시간으로 바꾸는 방식으로 모든 라인에 변수의 독립된 복사본을 제공하여 라인의 안전을 확보합니다.
    본문은http://gitbook.cn/gitchat/column/5a24fb14e3a13b7fc5933a44gitChat 스레드 수업의 학습 총결산 노트.

    좋은 웹페이지 즐겨찾기