0

我是 Java 并发的新手,想知道何时使用 LinkedBlockingQueue。假设有一个上传 servlet。可以同时上传。写入文件时,我们当前正在使用:

 // Used for synchronising a small portion of code
 private final Object writeLock  = new Object();

在文件实际写入文件系统的代码中,

 if (!file.exists()){
        synchronized(writeLock){
            fileItem.write( file ); 
        }               
 }

这工作得很好,到目前为止它已经工作了..我很想知道何时/如何使用 BlockingQueue 来解决这个问题,或者当我们可以使用对象锁时首先需要一个 BlockingQueue。

4

2 回答 2

1

使用 BlockingQueue 允许您在写操作周围没有同步块。Servlet 应用程序本质上是多线程的。您有多个线程等待服务 HTTP 请求。synchronized 关键字确保一次只有一个线程可以处理代码块。

使用 BlockingQueue,您将创建一个充当数据消费者的新线程。servlet 线程将充当该数据的生产者。只有单个消费者线程会处理写入文件。BlockingQueue 将确保消费者的写入请求被缓冲。消费者线程和所有生产者线程都需要对同一个 BlockingQueue 的引用。

一般的逻辑是这样的。

消费者:

while( true ) {
    final Item item = queue.take(); // This blocks until an item is placed on the queue.
    item.write( file );
}

制片人:

queue.put( item ); // put this in your servlet method

请注意,我省略了重要的细节,例如处理中断和产生消费者线程。有关更多详细信息,请参阅文档:http: //docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html

于 2013-09-26T04:20:11.313 回答
1

BlockingQueue每当您遇到生产者-消费者情况时,它都会很有用。该类不必显式处理锁定,而是为您处理线程安全并提供清晰有用的接口。

就您而言,尚不清楚您需要保护哪些内容免受同时访问;你想确保你没有文件名冲突吗?如果是这样,您需要同步包括if语句在内的整个片段,并且BlockingQueue对您没有太大帮助(您不能同时编写多个文件)。

于 2013-09-26T04:05:34.540 回答