자바 병렬 프로 그래 밍 학습 의 ThreadLocal

1983 단어 자바
용도.
로 컬 스 레 드 는 일반적으로 가 변 적 인 단일 인 스 턴 스 대상 이나 전체 변 수 를 공유 하 는 것 을 방지 하 는 데 사 용 됩 니 다.예 를 들 어 데이터 베이스 연결 등 이 있 습 니 다.ThreadLocal 을 Map 으로 볼 수 있 습 니 다.실제로 그렇게 이 루어 진 것 은 아니 지만.또한 트 랜 잭 션 컨 텍스트 를 ThreadLocal 에 저장 할 수 있 습 니 다.일부 기능 을 편리 하 게 처리 할 수 있 지만 내 현적 으로 결합 도 를 증가 시 켜 코드 의 재 활용 성 을 낮 출 수 있 기 때문에 ThreadLocal 의 남용 을 최대한 피 할 수 있 습 니 다.ThreadLocal 은 get 과 set 에서 자주 사용 하 는 방법 을 제공 합 니 다.set 는 값 을 설정 하 는 데 사 용 됩 니 다.get 은 set 설정 의 최신 값 을 가 져 오 는 데 사 용 됩 니 다.이 값 들 은 변 경 된 스 레 드 를 사용 하 는 것 에 비해 독립 된 복사 본 입 니 다.
예시
public class NotSafeDemo2 {
    private ThreadLocal num = new ThreadLocal<>();

    public void add(int value) {
        try {
            if (null == num.get()) {
                num.set(0);
            }
            int temp = num.get();
            num.set(num.get() + value);
            Thread.sleep(100);
            System.out.println(value + "+" + temp + "=" + num.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        NotSafeDemo2 synchronizeDemo = new NotSafeDemo2();
        AddThread3 addThread3 = new AddThread3(synchronizeDemo);
        AddThread4 addThread4 = new AddThread4(synchronizeDemo);
        addThread3.start();
        addThread4.start();
    }
}

class AddThread3 extends Thread {
    NotSafeDemo2 synchronizeDemo;

    public AddThread3(NotSafeDemo2 synchronizeDemo) {
        this.synchronizeDemo = synchronizeDemo;
    }

    @Override
    public void run() {
        synchronizeDemo.add(1);

    }
}

class AddThread4 extends Thread {
    NotSafeDemo2 synchronizeDemo;

    public AddThread4(NotSafeDemo2 synchronizeDemo) {
        this.synchronizeDemo = synchronizeDemo;
    }

    @Override
    public void run() {
        synchronizeDemo.add(2);
    }
}

실행 결 과 는 다음 과 같 습 니 다.자바 병렬 프로 그래 밍 학습 의 synchronize(1)의 예 를 직접 변경 하면 num 의 값 이 스 레 드 에 공유 되 지 않 습 니 다.

좋은 웹페이지 즐겨찾기