2014-06-11 2 views
1

잠금 배열을 사용하여 데이터베이스의 동일한 항목에 대한 동시 액세스를 보호하고 있습니다. 배열의 각 항목은 데이터베이스의 항목을 나타냅니다하지만 프로그램으로 성장할 수있는 데이터베이스가 실행됩니다, 그래서 동적에서처럼, 그것은 성장하기 위해 java.utils.Arrays.copyOf를 사용하여 계획되었다여러 스레드가 사용하는 개체를 다시 할당하십시오.

lockArray = Arrays.copyOf(lockArray, lockArray.length + 1); 

내 질문이있는 경우입니다 동시 실행에 문제가 발생할 수 있습니다. 예를 들어, 스레드가 복사가 완료 될 때 lockArray에서 읽으려는 경우 내가 생각할 수있는 문제는 copyOf 연산이 (내가 모르는) 원 자성이 아니라면, 배열이 복사되어 동일하게 변경되어 불일치가 발생하는 것입니다.

그렇다면이 문제를 피할 수있는 방법이 있습니까?

(배열이 항상 커지고 결코 줄어들지 않으며 lockArray의 데이터베이스 항목 색인은 배열이 몇 번이나 증가했는지에 관계없이 항상 동일하다는 점은 주목할 가치가 있습니다.)

+0

처음에는'lockArray'에 대해 생각하지 마십시오. 동시에 여러 스레드가 시도 할 경우 데이터베이스 자체를 확장하는 것이 어떻게 작동하는지 확인합니까? 데이타베이스의 성장을 지키고있는 자물쇠가 있다면, 간단하게'lockArray'의 확장을 같은 자물쇠에 두십시오. – Holger

+0

@Holger 데이터베이스가 자체 코드가 아닌 외부로 확장되었습니다. 코드는 항목을 읽거나 업데이트 할 수만 있고 항목을 만들 수는 없습니다. – user2891462

+0

아무 것도 변경되지 않습니다. 여전히 데이터베이스가 외부 적으로 변경되었는지 또는 어떤 결정을 내리는지를 감지했기 때문에 더 큰'lockarray '가 필요하다고 생각합니다. 이때 다중 스레드가 동일한 작업을 동시에 수행하지 않도록해야합니다. 어떻게해야합니까? – Holger

답변

1

새로운 배열을 스레드로부터 안전한 방식으로 게시하고 (예 : 휘발성 참조 사용) 배열 확장을 보호하면 여러 스레드가 동시에 배열을 확장 할 수 없습니다 (예 : synchronized 블록), 문제가 없어야합니다. (모든 새로운 잠금 인스턴스를 초기화 할 때까지는 다른 스레드가 새 lockArray를 사용할 수 없게됩니다.

+0

또한 새로운 lockArray에서 잠겨있는 것으로 보호되는 이전 lockArray에서 아무도 뭔가를 잠그지 않았는지 확인해야합니다. – selig

+1

@selig - 이전 배열의 잠금이 새 배열에 복사되므로 문제가되지 않습니다. – jtahlborn

+0

감사합니다, @jtahlborn. 나는 grow 메소드를 동기화 할 계획을 세웠지 만 새로운 배열을 thread-safe 방식으로 게시하는 것이 무엇을 의미하는지 알지 못합니다. 배열은 생성 된 모든 스레드에 전달 된 객체에 포함되어 있으며 각 스레드는 배열의 고유 항목에만 액세스합니다 (색인은 항상 동일 함).아직 null에있는 항목에 액세스하는 방법은 없지만 "게시하는"것에 대해 여전히 걱정할 필요가 있습니까? 방법? – user2891462

관련 문제