6: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++;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.