2013-11-03 2 views
-2

나는 비 차단 (잠금 해제) 프로그램을 작성하기가 정말 어렵다는 것을 알고 있습니다. 기본 구성 요소 인 CAS 작업을 사용하여 Java로 작성하는 동안 모든 것을 처리해야합니다.비 차단 프로그램 작성

- 편집 -

나는 자원을 공유하고 내가 공유 리소스를 잠글 수없는 경우, 대신에 내가 성공할 때까지 while 루프에 아마의 compareAndSet (expectedValue를, valueToSet) 명령을 사용할 것입니다. 자바에서는이 작업을 지원하는 AtomicXXX 클래스가 있습니다. 예를 들어

할지 모든 것을 내 명심해야합니다, 모든 테스트 시나리오가있을 수있는 .. 비 블로킹 스택 (연습 자바 동시성)을 참조하십시오 쓰기

+4

질문이 있으십니까? – SJuan76

+0

비 차단 프로그램을 원할 경우 공유 리소스가 없습니다. –

+0

공유 리소스가 있고 공유 리소스를 잠그고 싶지 않은 대신 compareAndSet (expectedValue, valueToSet) 명령을 while 루프에서 사용하는 것이 좋습니다. 자바에서는이 작업을 지원하는 AtomicXXX 클래스가 있습니다. 예를 들어 논 블로킹 스택 작성 참고 (Java Concurrency in Practice) –

답변

3

자물쇠 -의 주된 어려움 무료 프로그래밍은 아키텍처 수준에 있습니다. 서로의 데이터를 방해하지 않는 방식으로 코드와 알고리즘을 설계해야합니다. 별도로, 특히 독립적으로 실행할 수있는 개별 작업에서 코드를 "차단"해야합니다. 그러나 일단 그러한 아이디어를 들여다 보면 왜 전에 차단을 많이했는지 궁금해집니다.

예 : Given은 문장의 배열이며 각각의 단어를 계산하려고하며 스레드 방식으로 수행하려고합니다.

처음에는 스레드가 충돌 할 수있는 "초크 - 포인트"를 지정해야합니다. 이 경우 데이터 소스 (배열)와 결과의 계산 및 최종 println 인 데이터 출력. 따라서 이러한 데이터 소스를 동기화하거나 잠그지 않고이 작업을 수행하는 방법을 찾아야합니다. Lucky for you Java는 Atomics 클래스를 제공합니다.이 클래스는 블로킹없이 동시 액세스가 가능하며 많은 스마트 코딩이 가능합니다.

배열 액세스의 경우 두 가지 옵션이 있습니다. AtomicInteger를 인덱스로 사용하고 여기에 스레드 getAndIncremnt()의 작업 색인을 가져올 수 있습니다. 이것은 얼마나 많은 스레드가 있는지 또는 데이터 값의 길이를 알면 유용합니다 (힌트 : 실제로는 그렇지 않습니다).

두 번째 옵션은 각 스레드에 처음부터 결정적 색인을 할당하여 스레드가 다른 스레드와 간섭하지 않도록합니다. 너라면. 4 개의 스레드와 256 개의 데이터 값을 가지고 있다면 인덱스 값을 4 씩 증가 시켜서 분배 할 수 있습니다. 따라서 스레드 A는 0, 4, 8을 얻습니다. 스레드 B는 1, 5, 9, ... 등을 얻습니다. 이렇게하면 의도적으로 다른 스레드와 충돌하지 않는 스레드를 보장 할 수 있습니다.

끝에 계산은 똑같이 간단합니다. 먼저 스레드에서 내부적으로 단어를 계산 한 다음 addAndGet()을 사용하여 전역 AtomicInteger에 합을 더합니다.

이제 언제 값을 인쇄해야하는지 알아야합니다. 대답은 "마지막 스레드가 완료되었을 때"입니다. 이 작업은 카운터로 AtomicInteger를 사용하여 다시 수행 할 수 있으며 각 스레드가 decrementAndGet() 인 다음 0이 있는지 확인합니다. 이는 마지막 스레드이며 결과를 인쇄해야 함을 의미합니다. 그리고 차단을 할 수있는 Barrier 클래스를 사용할 수 있지만 더 이상 중요하지 않은 시점에서 모든 작업이이 시점에서 수행되기 때문에 가능합니다.