java - 如何编写线程安全操作并使它们原子化?

标签 java multithreading synchronization

让我们采用一个线程安全类,例如LinkedBlockingDeque:

BlockingQueue<Task> taskQueue = new LinkedBlockingDeque<Task>();

我知道像 takeput 这样的操作是线程安全的,因此它们尊重之前发生的关系。

但是如果我想组合一些操作以使其原子化怎么办? 像这样:

if(taskQueue.size() == 1) {
   /*Do a lot of things here, but I do not want other threads
     to change the size of the queue here with take or put*/
}
//taskQueue.size() must still be equal to 1

如果它是一个非线程安全的类,我可以这样做:

synchronized(taskQueue) {
  if(taskQueue.size() == 1) {
    /*Do a lot of things here, but I do not want other threads
      to change the size of the queue here with take or put*/
  }
  //taskQueue.size() must still be equal to 1
}

但事情没那么简单,我不认为takeput的实现使用了对象锁。

你如何处理这个扫描?

最佳答案

How do you handle this scenario?

一般来说,如果不使用某种外部锁定,就无法对并发数据结构进行“组合”操作。当您这样做时,您会重新引入您试图通过使用并发数据结构来避免的并发瓶颈。

在这种情况下,你是对的。 LinkedBlockingDeque 类使用私有(private)锁对象进行同步等。

关于java - 如何编写线程安全操作并使它们原子化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30965096/

相关文章:

java - 配置 Spring Boot 以监听本地主机旁边的请求

java - 将内存中的图像发送到休息服务器

java - 如何使用特定的类属性对 arraylist asc 进行排序?

javascript - 同步调用函数并返回值

java - 将 JSONPath 过滤器应用于带空格的字段

java - 如何停止阻止 BufferedReader.readline() 上的读取?

c - 带栅栏的 SPSC 线程安全

c - 如何等待其他线程初始化并在之后正确清理?

java - 同步块(synchronized block)是否有最大可重入限制?

c# - 同一功能中的多个锁