gpt4 book ai didi

java - java中的LinkedBlockingQueue和写锁

转载 作者:行者123 更新时间:2023-12-02 06:42:22 25 4
gpt4 key购买 nike

我是 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 可以让您在写入操作周围无需同步块(synchronized block)。 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 .

关于java - java中的LinkedBlockingQueue和写锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19019133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com