1

Queue我在Server班上得了一个:

public class Server{

    Queue<Input> inputQueue; 

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

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

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

4

4 回答 4

0

对我来说,您的问题似乎是 standard producer consumer case with Wait and Notify .

只需在 java 中搜索谷歌生产者消费者示例,您将获得数以千计的示例。希望对您有所帮助。

于 2013-08-15T12:42:23.997 回答
0

由于队列在线程之间共享,因此如果不同步读写方法,它就不是线程安全的。

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

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

于 2013-08-15T12:39:30.850 回答
0

尽管您现有的方法不是线程安全的,但手动同步的需要并不多。

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

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

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

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

ConcurrentLinkedQueue<Input> clq=new ConcurrentLinkedQueue<>(inputQueue);
于 2013-08-15T12:40:46.210 回答
0

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

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

于 2013-08-15T12:41:39.910 回答