java中的LinkedBlockingQueue和写锁

java中的LinkedBlockingQueue和写锁,java,multithreading,synchronization,locking,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

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

BlockingQueue
在生产者-消费者的情况下非常有用。该类不必显式地处理锁定,而是为您提供线程安全,并提供一个清晰而有用的接口


在您的情况下,不清楚您需要保护什么以防止同时访问;是否要确保没有文件名冲突?如果是这样,您需要同步整个代码段,包括
If
语句,而
BlockingQueue
对您没有多大帮助(您无法同时写入多个文件)。

使用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

注意,我忽略了一些重要的细节,例如处理中断和生成消费者线程。有关更多详细信息,请参阅文档:。

您的上载servlet是否在每个请求上都写入相同的
OutputStream
对象?我认为您误解了如何在servlet中执行多线程,这可能是这里更大的问题,而不是
LinkedBlockingQueue
。正如您所知,该代码不是线程安全的。您需要检查同步块内部是否存在,否则就没有意义了。我们必须处理文件上传并将数据插入数据库以及文件系统。那么我们在这里如何处理多线程呢。