Java 멀티스레드-학습노트2: Synchronized 잠금 재입력 &volatile 키워드 & ThreadLocal
Synchronized 잠금 재입력
Synchronized를 사용할 때, 한 라인이 대상의 자물쇠를 얻고, 이 라인에서 코드를 실행할 때, 이 대상의 자물쇠를 다시 요청하면 바로 이 대상의 자물쇠를 얻을 수 있다.한 라인이 다른 라인이 가지고 있는 자물쇠를 요청할 때, 이 라인은 막히고, 이 라인이 자신이 가지고 있는 자물쇠를 요청할 때, 이 자물쇠가 다시 잠기면 성공을 요청하고, 그렇지 않으면 막힌다.한마디로 자기 내부의 자물쇠를 얻을 수 있다.
자물쇠를 다시 넣을 수 있는 역할: 자물쇠가 사라지는 것을 최대한 피한다.
잠금 재설정 가능한 추가 기능:
volatile와synchronized의 차이
volatile 키워드의 역할: 라인의 개인 데이터 창고에서 변수의 값을 얻는 것이 아니라 공공 창고에서 변수의 값을 얻는 것을 강제합니다.
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 스레드 수업의 학습 총결산 노트.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
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();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.