2014-06-12 3 views
0

JIRA (OpenSocial?) 가제트/플러그인 공유에 대한 모든 요청을 공유하기를 원하는 일부 데이터 (두 개의 HashSets 및 타임 스탬프 인스턴트)가 있습니다 - 생성하는 데 오랜 시간이 걸리므로 공유하면 요청이 더 효율적으로 수행됩니다.Jira : 스레드 안전 가젯 데이터?

간혹 (매우 드물지만) 요청에이 공유 데이터가 새로 고쳐 져야 함을 나타내는 매개 변수가 포함될 수 있습니다. 물론 처음으로 필요한 경우 채워집니다. 데이터가 부실한 답변을 나타내는 것은 괜찮습니다. 느리게 변경되고 추세를 시각화하는 데 사용되어 오프 - 바이 - 원 오류가 용인 될 수 있습니다.

JIRA가 시작될 때 (또는 추가 기능의 새 버전을 업로드 할 때) 처음 몇 분 동안 여러 요청이 들어 왔을 때,이 비싼 공유 데이터의 스레드로부터 안전한 방법. 현재 결과는 괜찮아 보이지만 내가 이해할 때, 그것은 단지 우연에 의한 것입니다.

하나의 스레드 만 채우기 작업을 수행해야합니다. 시작시 다른 스레드는 빈 손으로 건너 뛸 수 없으므로 물론 기다려야합니다. (모든 스레드가 값 비싼 초기화를 수행하면 서버에 많은 불필요한로드가 발생합니다.)

초기 비용 후 여러 개의 동시 요청이 들어오고 그 중 하나에 '새로 고침'매개 변수가 포함되면 해당 스레드 가격을 지불 할 필요가 있습니다. 다른 스레드가 값 비싼 데이터의 이전 복사본을 사용하여 성능을 유지하는 것이 좋습니다. "예 누군가에 데이터를 새로 고치지 만 여기에 결과가 있습니다. 오래 된 복사본 ".

데이터에 대한 추가 정보 : 두 개의 HashSet 및 타임 스탬프는 일관된 스냅 샷을 나타내는 데 사용됩니다. HashSet 내용은 데이터베이스의 값에만 의존하며 타임 스탬프는 최근 새로 고침 한 시간입니다. 이 데이터는 이전의 스냅 샷에 따라 다릅니다. 그리고 그것도 프로그램 상태에 달려 있습니다. 타임 스탬프는 "이 데이터가 얼마나 오래된가"라는 질문에 거친 의미로 대답하는 데에만 사용됩니다. 데이터가 새로 고침 될 때마다 나는 더 최근의 타임 스탬프를 기대하지만 그것이 틀렸다면 아무 것도 깨지지 않을 것입니다. 디버깅과 투명성을위한 것입니다. 스냅 샷은 이전 스냅 샷이나 프로그램 상태에 의존하지 않으므로 래핑되어 휘발성 상태로 표시 될 수 있습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 대안의 장단점?

답변

1

잠금을 사용하면 한 번에 하나의 스레드 만 실행해야하는 코드 섹션에 대한 액세스를 동기화 할 수 있습니다. 너무 자세하게 잠금을 사용하는 방법을 보여주는 SO와 Java Java 문서에는 많은 리소스가 있지만, 이와 같은 것이 트릭을 수행해야합니다.

아이디어는 가장 최근에 생성 된 결과 집합의 복사본을 유지하려는 것이고 새로운 데이터 집합을 사용할 수있을 때까지 항상 복사본을 반환한다는 것입니다.

+0

[1]을 나타내는 열거 형을 입력으로 사용하는 동기화 된 방법은 무엇입니까? [2] 1과 동일하지만 새로 고침을 요청하고 [3] 올바른 답을 갖고 있어야합니다. 나는 그 일을 기꺼이하겠다. synchronized 메서드는 호출자가 새로 고침 작업을 수행해야하는 실패자 스레드인지 여부와 함께 번들로 제공된 데이터의 복사본을 즉시 반환합니다. 그런 다음 호출자는 결과를 가져 와서 데이터를 사용하거나 가격을 지불하여 최신 새로 고침 결과로 서블릿의 휘발성 데이터 세트를 새로 고치고 설정합니다. 따라서 경쟁 조건이 없습니까? – user3735178

+0

초기 발신자 - 데이터가 계산되기 시작하면서 실패자라고 알려줍니다. 다른 사람들은 null 사본을받으며 null이 아닌 결과를 얻기 위해 폴링을 시작해야한다는 것을 알아야합니다. – user3735178

+0

원래 질문의 조건을 충족하고 이전에 주석 처리 된 경쟁 조건을 제거하는 isLocked() 대신 tryLock()을 사용하도록 답변을 편집했습니다. 위의 주석에서 원하는 새로운 3 옵션 동작은 더 복잡하기 때문에 초기'tryLock()'이 실패하면 명시 적으로'lock()'콜백을 추가하고 조건을 정렬하여 그 후에 올바른 방향으로 흐른다. –