2011-11-08 6 views
2

다른 스레드에서 생성 한 바이트를 쓰는 리소스 (디스크의 파일)가 있다고 가정합니다. 이러한 스레드는 일부 이벤트를 수신하고 이벤트가 발생할 때마다 스레드를 생성하는 일부 프로세스에 의해 만들어집니다.리소스에 대한 동기화 된 액세스

synchronized void write(byte [] bytes) { 
     //write data to file 
    } 

또는 일부 뮤텍스 생성 : 우리는 하나의 자원을 가지고, 우리는 작업을 쓰기 수행하는 클래스의 방법을 동기화해야 우리가 아주 오래된 하드 드라이브가 있다고 가정 지금

Object mutex = new Object(); 
void write(byte [] bytes) { 
    synchronized(mutex) { 
     //write data to file 
    } 
} 

을 그리고를, 그래서 너무 느리게 쓰기 작업을 수행합니다. 그리고 하루에 수 차례 우리는 매우 많은 양의 사건이 발생했습니다. 따라서 스레드는 자원에 대한 대기열과 같은 것을 만들 것입니다. 다음 질문이 있습니다.

  1. 대기열의 길이는 얼마나 될까요?
  2. 리소스와 리소스를 기다리는 스레드가 여러 개인 경우 은 리소스를 차지하는 첫 번째 스레드를 해제합니다. FIFO 원리일까요?
  3. 스레드의 우선 순위가 다른 경우 상황이 어떻게 바뀌나요?
  4. 리소스가 연결 풀링에 참여하는 개체를 생성하는 DataSource 개체 인 경우 위의 파일과 동일합니까?

답변

3
  1. 큐의 길이는 차단 된 스레드의 수입니다. 스레드를 계속 작성하고 모두 서면으로 차단되기 시작하면 시스템이 신속하게 무릎을 꿇게됩니다. 확실히 쓰레드 풀을 사용하고, 쓰레드를 생성하는 대신 쓰레드를 재사용하고, 너무 많은 이벤트가 큐에 있으면 차단해야합니다. Executors을 참조하십시오.
  2. 아니요, FIFO가 아닙니다. 순서는 정의되지 않습니다. FIFO를 원할 경우 공정한 ReentrantLock을 사용할 수 있습니다. 그러나 기본 동기화 또는 불공정 잠금보다 시간이 많이 걸립니다.
  3. 플랫폼에 종속적이며 결정적으로 작동하지 않습니다.
  4. 모두가 데이터 소스의 구현에 따라 다릅니다. 공정한 알고리즘을 사용하거나 단순히 공정한 잠금을 사용할 수 있습니다. 또는 동기화를 사용하고 공정하지 않을 수 있습니다. 충분히 자세하다면 데이터 소스의 문서를 읽을 필요가있다.
2
  1. 이 디자인에서 대기중인 스레드의 양에는 이론적 인 제한이 없습니다.
  2. 예측할 수 없습니다. java의 함축 된 스펙은이 유형의 단순 잠금에 대해 스레드 순서를 필요로하지 않습니다. 실제 질서는 JVM과 호스트 아키텍처의 구현에 달려 있지만, 이것에 의존해서는 안됩니다.
  3. 이것은 스레드 엔진에 달려 있으며 효과가 있거나 없을 수도 있습니다. 그러나 JVM 스레드 엔진은 낮은 우선 순위의 스레드를 예약하려고 시도하고 실제로 실행중인 낮은 우선 순위의 스레드를 우선적으로 우선합니다.
  4. 스레드에 관한 한, 둘 다 똑같습니다. 스레드는 리소스 사용을 제어하기 위해 동기화 메커니즘에 의존하며 정확한 리소스는 연결이 파일보다 느린 경우 더 긴 대기 시간 이외에는 동작을 변경하면 안됩니다. 내 제한된 이해에서
+0

당신은 스레드가 무작위로 자유 자원을 점유 할 것이라고 말하면 이런 상황에서 FIFO를 만드는 방법은 무엇입니까? 어떤 스레드 엔진에 대해 이야기하고 있습니까? – maks

+0

내장 된 JVM 스레드 엔진. – 3martini

+0

[QueuedSynchronizers] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/AbstractQueuedSynchronizer.html)에서 FIFO와 같은 기능을 수행하십시오. 불행히도, 나는 결코 그 싱크로를 사용하지 않았다. 그래서 나는 우리가 말하는대로 그것을 배우고있다! – 3martini

2

:

1 시스템이 가질 수있는 스레드의 수 (나는 그것이 스레드 또는 일부 OS 기본 자원 제한의 최대 수에 의해 제한 생각)에 의해 제한, 꽤 큰 일 수있다 . 100 이상을 보았습니다.

2 예. 스레드는 FIFO 방식으로 리소스를 확보해야합니다.

3- 아니요 우선 순위가 더 높은 스레드가 더 빨리 줄 수 있지만 줄에 정렬되면 해당 위치가 고정됩니다.

4- 데이터 소스는 다를 수 있지만 기본적으로 풀 구현에 따라 달라집니다. 아파치의 dbcp (Tomcat에서 볼 수 있듯이)는 이런 식으로 동작한다고 생각합니다. 단, 풀이 설정된 시간에 연결을 할당 할 수없는 경우에는 시간 초과가 발생할 수 있습니다.

희망이 도움이됩니다.

관련 문제