나는 라이브 소켓을 얻기 위해 동시에 여러 스레드에 의해 호출되는 아래 메소드를 가지고있다. 매개 변수로 LinkedBlockingQueue
을 취한 다음 사용 가능한 liveSocket이 있는지 반복하고 볼 수 있습니다. 사용 가능한 경우 소켓을 제거한 다음 반환합니다.LinkedBlockingQueue에서 elments를 제거하는 동안 아래 코드가 안전합니까?
private Optional<Holder> getSocket(final LinkedBlockingQueue<Holder> endPoints) {
Optional<Holder> liveSocket = Optional.absent();
if (!endPoints.isEmpty()) {
for (Holder state : endPoints) {
// check if socket is live? if yes then remove and return that.
if (state.isLive()) {
liveSocket = Optional.of(state);
endPoints.remove(state);
return liveSocket;
}
}
}
return Optional.absent();
}
위의 코드가 스레드로부터 안전한지 여부를 확인하고 싶습니까? 여기서 Holder
은 변경 불가능한 클래스입니다.
큐 연산 스레드 안전하지만 포함 된 개체의 상태가 아니다. 'liveSocket'이 상태를 검사 할 때와 큐에서 제거 할 때 사이에 다른 스레드에 의해 non-live가되면 어떻게됩니까? –