这个线程对于两个线程在java中的队列共享是否安全?

时间:2013-08-15 12:36:28

标签: java multithreading queue

我的Queue课程中有一个Server

public class Server{

    Queue<Input> inputQueue; 

    public void start() {
      inThread = new InThread(inputQueue);
      outThread = new OutThread(inputQueue);

      inThread.start();
      outThread.start();
    }
}

inThread将负责填写inputQueue中的数据,outThread将负责从outputQueue中取出数据。 InThreadOutThread将同时执行。数据是否有可能不安全?如果是这样,我做了一些研究,它有同步变量和同步方法。我应该使用哪一个?谢谢。

4 个答案:

答案 0 :(得分:0)

由于队列在线程之间共享,因此如果没有对读取和写入方法进行同步,则它不是线程安全的。

如果您想要一个现成的线程安全队列,那么您可以考虑使用ConcurrentLinkedQueue:

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html

答案 1 :(得分:0)

虽然您现有的方法线程安全,但手动同步并不是很需要。

java.util.concurrent.ArrayBlockingQueue<E>可以为您效劳。它的构造函数允许传入一个集合,所以你可以这样做:

ArrayBlockingQueue<Input>blockingQueue=new ArrayBlockingQueue<>(128, false, inputQueue);

将128更改为容量,将布尔值更改为指定在块之后排队是否公平。

您也可以使用ConcurrentLinkedQueue。它的构造函数只是:

ConcurrentLinkedQueue<Input> clq=new ConcurrentLinkedQueue<>(inputQueue);

答案 2 :(得分:0)

我会使用一个包装线程池和队列的ExecutorService,并为您编写线程安全/测试/。

你是对的,有些队列需要外部同步,但如果你使用像ConcurrentLinkedQueue这样的线程安全集合,你就不需要同步,但是如果你这样做也不会有太大的影响。

答案 3 :(得分:0)

对我来说你的问题似乎是standard producer consumer case with Wait and Notify的情况。

在java中只是谷歌生产者消费者的例子,你会得到成千上万的例子。希望它有所帮助。