2017-12-19 20 views
0

개체의 2D 배열에서 두 요소의 원자 적 업데이트를 수행해야합니다. 개체는 배열에 위치 (x, y)에 항목을 저장할 수 있는지 여부와 어떤 형식인지 이미 저장되어 있는지 여부를 나타냅니다. 따라서 객체 자체는 변경되지 않지만 내부 상태는 변경됩니다.배열의 2 요소에서 동기화 Java

 for (int i = 0; i < storage.length; i++) { 
      synchronized (storage[i][j]) { 
       synchronized (storage[i+1][j]) { 
        if (storage[i][j].isfree() && storage[i+1][j].isfree()) 
         return (storage[i][j].store(true)&&storage[i+1][j].store(true)); 
       } 
      } 
      synchronized (storage[i][j]) { 
       synchronized (storage[i][j+1]) { 
        if (storage[i][j].isfree() && storage[i][j+1].isfree()) 
         return (storage[i][j].store(true)&&storage[i+1][j+1].store(true)); 
       } 
      } 
     } 
    } 

내가 복용 항목을 저장할 수있는 (무료 슬롯을 찾고 배열을 반복하고있다 : 나는 현재 2 중첩을 사용하고

내가 배열의 두 요소에 대한 액세스를 동기화하고있는 문을 동기화 두 슬롯을 동기화) 두 개의 동기화 된 블록을 무조건 입력하십시오. 두 번째 블록 안에 배열의 두 슬롯이 비어 있는지 확인합니다. 그러면 새 항목을 저장합니다. 그렇지 않으면 다음 배열 요소로 이동합니다.

제 질문은이 작품입니까? 여러 스레드에서이 코드를 실행하면 업데이트가 원본이 될 것입니다. 또는 동일한 결과를 얻는 더 좋은 방법이 있습니다. 하지만 대부분 내 질문은 첫 번째 질문입니다.

도움 주셔서 감사합니다.

+0

왜이 용도로 배열을 사용하고 있습니까? – Kayaman

+0

두 명의 다른 자식을 보유하고있는 객체를 만드는 것이 어떻습니까? – Lino

+0

각 저장소 (하나 또는 둘)가 항목을 보유 할 수있는 저장소에 많은 슬롯이 있습니다. 몇몇 품목은 2 개의 구멍을 점유하는 1 개의 구멍을 점유한다. 따라서 어떤 경우에는 두 개의 슬롯에서 동기화해야 할 필요가 생깁니다. –

답변

0

우선 동기화 지점은 이며, 값 비싼입니다. 귀하의 코드는 각 배열 요소에 두 번에 동기화됩니다 (코드는 또 다른 루프 내에서 실행됩니다). 그것은 단순히 절대 피하기를 원하는 것입니다.

대신 유용한 추상화를 만드십시오. 즉, 실제로 배열을 채우는 클래스 - 필요한 작업을 수행하는 메소드를 제공합니다. 그런 다음 그 방법을 내부적으로 동기화하십시오!

+0

이것은 작업을 수행하는 방법입니다. 그러나 2d 테이블에서 두 개의 빈 슬롯을 찾아야합니다. 물론 두 개의 슬롯을 찾을 때까지 배열을 반복해야합니다. 나는 배열을 반복하고 동시에 2 개의 슬롯을 잠그는 것 이외의 다른 방법을 보지 못한다. 그리고 내부 동기화 된 블록 만 찾을 수 있습니다. 그렇지 않으면 다른 스레드가 그 동안 슬롯을 채울 수있었습니다. 어쩌면 내가 틀렸어. 스레드 안전한 방법으로 이것을 할 수 있을까? 당신의 아이디어가 무엇인지 말해 주실 수 있습니까? 감사 –