如何组成线程安全操作并使它们成为原子?

时间:2015-06-21 13:36:13

标签: 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的实现不会使用对象锁。

你如何处理这个scanario?

1 个答案:

答案 0 :(得分:2)

  

你如何处理这种情况?

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

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