2016-05-04 23 views
2

私は今、セマフォを持つカスタムブロッキングキューを実装しました。ブロッキングキューの実装

キューが空の場合、私のキューはセマフォによってブロックされていません。

は、ここに私の実装です:

package poolThread; 

import java.util.LinkedList; 
import java.util.Queue; 
import java.util.concurrent.Semaphore; 

public class MyQueue<E> { 
Semaphore s = new Semaphore(0, true); 
private Queue<E> queue = new LinkedList<E>(); 


public boolean isEmpty(){ 
    return this.queue.isEmpty(); 
} 
public void enqueue(E e){ 
    queue.add(e); 
    s.release(); 
} 
public E dequeue(){ 
    E e = null; 
    try { 
     s.acquire(); 
    } catch (InterruptedException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    e = queue.remove(); 
    return e; 

} 

}

あなたは私が私のコードに障害を見つけるのに役立つだろうか?

+0

?あなたのキューが空の場合、これはブロックされます*。 –

+0

スレッドプールを実装するためにこのブロックキューを使用していましたが、ブロックしないスレッドはほとんど実行しません。 – gil

+0

私はArrayBlockingQueueのjava実装を代わりに使用して、動作しているかどうかを確認しました。動作しているので、問題は私のブロッキングキューインプリメンテーションにあると確信しています。 – gil

答えて

2

ここでの問題は、LinkedListです。これはスレッドセーフではありません。したがって、許可が適切に取得されたとしても、LinkedListremove()操作は問題を引き起こす可能性があります。

MyQueue<String> x = new MyQueue<>(); 

ExecutorService es = Executors.newFixedThreadPool(2); 
for (int j = 0; j < 2; j++) 
    es.submit(() -> { 
     String tn = Thread.currentThread().getName(); 
     for (int i = 0; i < 2; i++) 
      x.enqueue("v" + i); 

     for (int i = 0; i < 2; i++) 
      System.out.println(tn + " deq: " + x.dequeue()); 
    }); 

が出力(あなたがremove方法にNoSuchElementException秒に起因するnull秒が表示されます)のようになります:ここでの挙動を示すように、単純な「テストケース」だ

pool-1-thread-2 deq: v0 
pool-1-thread-1 deq: null 

最も単純このための解決方法は、LinkedListjava.util.concurrent.ConcurrentLinkedQueueに置き換えることです。

+0

実装の背後にあるすべての私のアイデアは、私の自己すべてをスレッドセーフにし、それから学び、Javaスレッドセーフな要素を使用しないように実装することです。あなたは私にどのように同時にリンクされたリストなしでそれを実装するための提案がありますか? – gil

+0

@gilleibovitzそれでは、リストアクセスが 'synchronized'ブロック内でのみ起こるか、' Lock'を使用するようにする必要があります。詳細については、[here](http://tutorials.jenkov.com/java-concurrency/locks.html)を参照してください。 – nyname00

+0

@ gilleibovitz:またはCollections.sychronizedListを使用してください。これは、Java Concurrency in Practiceの例です。 –

関連する問題