LinkedBlockingQueue和java中的写锁

时间:2013-09-26 04:02:00

标签: java multithreading synchronization locking

我是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。

2 个答案:

答案 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