병렬 프로그래밍 (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의 운행 효율을 높였지만 충돌과 더러움이 발생하기 쉽다

좋은 웹페이지 즐겨찾기