2014-11-06 4 views
1
가 여기에 자바와 함께 할 노력하고있어 무엇

최대 동시성을 촉진하기 위해 , 그들은 disjoint 쓰기 세트가 있습니다. 쓰기 세트가 교차하는 경우 스레드를 대체해야합니다. 따라서 동기화 블록에 doStuff을 넣을 수는 없습니다. 항상 필요한 것은 아니기 때문입니다.선택적으로 시행 동기화

쓰기 세트의 항목을 잠글 수 있지만 교차하는 쓰기 세트가있는 두 개의 스레드가 같은 잠금에서 대기하는 경우 교착 상태가 발생할 수 있습니다. 예를 들면 : (내가 가지고 올 수까지)

Lock[] locks = new Lock[allAvailableVariables.length]; 
public void getLocks() { 
    for(i = 0; i < allAvailableVariables.length; i++) 
     if(i is in writeSet) 
      locks[i].lock(); 
} 

가장 쉬운 방법은 그것을 피하기 위해 당신의 쓰기 세트의 잠금의 획득을 동기화하는 것입니다. 그러나 교차 쓰기 세트가있는 두 개의 스레드가 동기화 블록에 들어가기 위해 경쟁하는 경우 다른 두 스레드와 분리 된 쓰기 세트가있는 스레드는 동기화 블록을 나갈 때까지 대기해야합니다.

필자는 스핀 잠금을 사용할 수 있다고 생각하지만 가능하면 쓰기 세트가 비싸지는지 여부를 평가하는 것을 피하고 싶습니다.

전혀 이해가 되나요?

답변

3

잠금 주문을 사용하려는 것 같습니다.

잠금 장치를 일종의 자연 순서로 정렬하십시오. 그런 다음 차례대로 잠급니다.

aba < b의 자물쇠가 있다고 가정합니다. 두 스레드가 ab을 모두 잠그고 자한다면, 그들은 모두 a을 잠글 것입니다. 따라서 스레드가 b으로 잠겨 있고 a에서 차단 된 상황을 가질 수 없으며 다른 스레드가 잠긴 동안 ab에서 차단됩니다.

+1

잠금 장치가 필요한 시간을 미리 알 수 없으면 (예 : 'doStuff()'중간에 새 잠금 장치가 있어야 함) 알 수없는 경우에 한 가지 주름이 생길 수 있습니다. 이 경우, 하나의 옵션은'tryLock()'을 통해 잠금을 획득하려고 시도하는 것이다. 그게 성공한다면, 훌륭합니다. 그렇지 않다면 모든 것을 풀고 모든 작업을 취소 한 다음 필요한 잠금 장치로 다시 시도하십시오. – yshavit

+1

@yshavit. 소프트웨어 거래 메모리와 관련하여 문제에 관해 상당한 양의 문헌이 있습니다. –