我是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。
答案 0 :(得分:1)
BlockingQueue
就很有用。该类不必显式处理锁定,而是为您提供线程安全性,并提供清晰有用的界面。
在您的情况下,您不清楚需要保护什么以防止同时访问;你想确保你没有文件名冲突吗?如果是这样,您需要同步整个代码段,包括if
语句,而BlockingQueue
对您没有多大帮助(您无法同时编写多个文件)。
答案 1 :(得分: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。