처리 할 객체가있는 LinkedList가 있습니다. 객체는 다른 스레드에서 객체에 추가되지만 하나의 스레드 만이 객체를 제거/읽습니다. 다른 스레드에서스레드 안전성 문제
private LinkedList<MyObject> queue = new LinkedList<>();
new Thread()
{
@Override
public void run()
{
while (!Thread.interrupted())
{
if (!queue.isEmpty())
{
MyObject first = queue.removeFirst();
// do sth..
}
}
}
}.start();
나는 정말 나 자신에게 설명하지 못할
queue.add(new MyObject());
때때로이 코드는하지만 예외로 연결 대기열에 객체를 추가합니다. java.util.LinkedList.removeFirst (LinkedList.java:270) 나는이 예외가 왜 만 제거하려고해야하기 때문에 얻을 해달라고
에서 java.util.NoSuchElementException ""스레드 예외 만약 존재한다면 객체.
큐가 비어있을 때 소비자 스레드가 "busy waiting"을 수행합니다. 아마 고쳐야 할 것입니다. –
조금 바보 같지만, 이러한 것들은 예측하기가 매우 어려울 수 있기 때문에 removeFirst 메소드를 호출하는 스레드가 실제로 있다는 것을 확실히하는 것이 좋습니다. if 문 안에 스레드 id의 프린트를 추가하십시오. – TheFooBarWay
@ TheFooBarWay 한두 명의 소비자가 있는지 여부는 중요하지 않습니다. 동기화 문제를 일으키는 데 충분한 여러 개의 생성자가 있습니다. 개체를 수정하는 스레드가 두 개 이상있는 경우 동기화해야합니다. 정확하게 하나의 스레드를 수정하고 여러 스레드가 읽는다면 비동기적일 수 있습니다 (그러나 반복은 까다로울 수 있음). –