병렬 프로그래밍 (7) 스레드 안전과 비스레드 안전/동기화 및 비동기화
2424 단어 라인
통속적으로 말하면 여러 개의 라인이 같은 코드에 접근하면 서로 다른 결과가 나오지 않고 반대로 비라인 안전이다.
먼저 예를 살펴보겠습니다.
4
public class TestThreadSync {
private int count=0;
public void sum() {
for (int i = 0; i <= 100; i++) {
count+=i;
}
System.out.println("The count-size:" + count);
}
class syncThread1 extends Thread {
@Override
public void run() {
sum();
}
}
public static void main(String[] args) {
TestThreadSync ts = new TestThreadSync();
syncThread1 t1 = ts.new syncThread1();
syncThread1 t2 = ts.new syncThread1();
t1.start();
t2.start();
}
}
위의 예에서 두 라인은 모두 방법을 통해sum에서 0에서 100의 구화를 얻으려고 했지만 공용 변수count로 인해 결과가 불확실한 값이 있을 수 있다. : :
The count-size:10100 The count-size:5050
The count-size:10100 The count-size:10100
어떤 상황에서 라인 안전 문제가 발생합니까?
위의 예에서 알 수 있듯이 스레드 1과 스레드 2는 공유 변수count를 가지고 있어 스레드 안전 문제가 발생했다. 실제 상황에서 여러 스레드가 공유 자원(스레드가 프로세스가 차지하는 자원과 주소 공간을 공동으로 누릴 수 있음)에 동시에 접근할 때 스레드 안전 문제가 발생한다.
어떻게 라인 안전 문제를 해결합니까?
기본적으로 모든 병렬 모드는 루트 안전 문제를 해결하는데 동기적인 상호 배척 접근을 사용한다. 즉, 같은 시간에 하나의 루트만 공유 자원에 접근할 수 있다. 즉, 공유 자원에 접근하는 코드 앞에 자물쇠를 달고 공유 자원에 접근한 후에 자물쇠를 풀고 다른 루트를 계속 방문하게 한다. 물론 공유 자원을 사유 자원으로 바꾸는 전략도 사용한다. 예를 들어threadLocal,이것은 우리가 뒤에서 토론할 것이다.
위의 예에서 볼 수 있듯이 우리는count 변수를sum 방법의 국부 변수로 바꿀 것이다. 아래 그림은 다음과 같다.
4
public class TestThreadSync {
// private int count=0;
public void sum() {
int count=0;
for (int i = 0; i <= 100; i++) {
count+=i;
}
System.out.println("The count-size:" + count);
}
class syncThread1 extends Thread {
@Override
public void run() {
sum();
}
}
public static void main(String[] args) {
TestThreadSync ts = new TestThreadSync();
syncThread1 t1 = ts.new syncThread1();
syncThread1 t2 = ts.new syncThread1();
t1.start();
t2.start();
}
}
결과는 다음과 같습니다.The count-size:5050
The count-size:5050
위의 예는 변수 안전 문제를 보여준다. 다음에 우리는 어떻게 동기화 상호 배척 방문을 이용하여 라인 안전 문제를 해결하는지 연구한다. 먼저 우리는 두 가지 개념, 동기화와 비동기화를 이해한다.
동기화:
같은 시간에 한 라인만 공유 자원에 접근할 수 있다. 즉, 공유 자원에 접근하는 코드 앞에 자물쇠를 붙여서 공유 자원에 접근한 후에 자물쇠를 풀어야 다른 라인이 계속 접근할 수 있다.
동기화는 병렬 접근을 제한하고 성능 손실을 가져왔지만 데이터의 완전성과 정확성을 높였다.
비동기식:
한 라인이 자원을 요청합니다. 이 자원은 다른 라인에서 사용되고 있습니다. 요청 자원 라인은 이 자원을 사용할 수 있습니다.
비동기적으로 cpu의 운행 효율을 높였지만 충돌과 더러움이 발생하기 쉽다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 라인과synchronized 키워드를 깊이 있게 설명하다루틴이야말로 프로그램의 집행자이고 여러 루틴 간에 프로세스 중의 자원을 공유하고 있다.하나의 cpu는 동시에 하나의 라인만 실행할 수 있으며, 모든 라인은 하나의 타임 슬라이스가 있으며, 타임 슬라이스가 다 사용하면...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.