我的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中取出数据。 InThread
和OutThread
将同时执行。数据是否有可能不安全?如果是这样,我做了一些研究,它有同步变量和同步方法。我应该使用哪一个?谢谢。
答案 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中只是谷歌生产者消费者的例子,你会得到成千上万的例子。希望它有所帮助。