2016-07-13 2 views
0

Java를 사용하고 있습니다. FIFO 큐에 데이터를 게시해야합니다. 이 대기열은 별도의 스레드에서 처리됩니다. 이렇게하면 주 스레드를 차단하지 않습니다. 게시 관련 데이터 내 유스 케이스는 : -일부 조건에 따라 고유성을 제공하는 FIFO 대기열이 있습니까

  • 각 데이터 객체를 고유하게 식별하는 필드, ..을 가져서 50 홀수 예 '키'가있다. 객체의 나머지 데이터 인 다른 필드가 있습니다.
  • 새 데이터 개체가 오는 경우 맹목적으로 대기열에 삽입하면 안되지만 이전 데이터를 대체해야합니다 .. 해당 데이터가 필드 비교 등을 기준으로 다를 경우. 그렇지 않으면 단순히 삭제됩니다. 기억하십시오. 필드 중 하나가 키입니다. 휴식은 데이터이며 크게 다를 수 있습니다.
  • 이러한 데이터는 FIFO 단위로 처리해야합니다. 따라서 대기열 종류가 필요합니다.
  • 말할 필요도없이 스레드도 안전해야합니다.

누구나 이러한 기준을 충족하는 데이터 구조를 알고 있습니까? 감사.

+0

업데이트가 기존 항목을 대체해야하는 경우 새 항목이 이전 항목을 대기열로 이동합니까 아니면 이전 항목이 대기열에서 삭제되고 새 항목이 끝에 추가됩니까? – jtahlborn

+0

또한 어떤 종류의 동시성 성능을 기대합니까? – jtahlborn

+0

대기열에 최대 50 개의 요소가 있기 때문에 일부 동기화 된 블록에서 간단한 목록 래퍼를 사용할 수 있습니다. 극단적 인 수준의 동시성이 필요하지 않는 한. – jtahlborn

답변

0

C#에서 이와 같이해야 할 때 사전과 대기열이 포함 된 사용자 지정 데이터 구조를 만들었습니다. Dictionary는 항목 키에 의해 색인화되었으며 값에는 키와 관련된 데이터가 포함되었습니다. 큐에는 키만 들어 있습니다.

큐에 항목을 삽입하려면, 나는 한 다음 (의사)

lock the data structure 
    if key exists in dictionary 
     replace old item data in dictionary with new item data 
    else 
     add new item to the dictionary, indexed by key 
     add new item key to the queue 
release lock 

이 항목 큐에서 제거하려면 :

lock 
    remove first item key from queue 
    lookup data for that key in dictionary 
    remove item from dictionary 
release lock 
process the item 

우리는 여러 스레드에서 업데이트 천 번째했다, 그리고 성능 문제가 발생하지 않았습니다. 자물쇠는 아주 오랫동안 열리지 않습니다. 물론 마일리지가 다를 수 있습니다.

메인 스레드가 업데이트를 푸시 할 수있는 잠금없는 동시 대기열을 추가하여 메인 스레드에서 잠금을 피할 수 있습니다. 다른 쓰레드는 그 큐를 서비스 할 수 있고 위에서 설명한 하이브리드 사전/큐 구조에 항목을 추가 할 수 있습니다.

관련 문제