一尘不染

什么是“非阻塞”并发,它与普通并发有何不同?

java

  1. 什么是“非阻塞”并发,它与使用线程的普通并发有何不同?为什么在所有需要并发的场景中不使用非阻塞并发呢?使用非阻塞并发是否有开销?
  2. 我听说Java中提供了非阻塞并发。在某些特殊情况下,我们应该使用此功能吗?
  3. 在集合中使用这些方法之一有什么区别或优势?权衡是什么?

第三季度示例:

class List   
{  
    private final ArrayList<String> list = new ArrayList<String>();

    void add(String newValue) 
    {
        synchronized (list)
        {
            list.add(newValue);
        }
    }
}

private final ArrayList<String> list = Collections.synchronizedList();

这些问题更多是从学习/理解的角度来看的。感谢您的关注。


阅读 174

收藏
2020-12-03

共1个答案

一尘不染

什么是非阻塞并发?它有什么不同。

正式:

在计算机科学中,非阻塞同步可确保争用共享资源的线程不会因互斥而无限期地推迟执行。如果可以保证系统范围内的进度,则非阻塞算法是无锁的;如果还保证每个线程的进度,则无需等待。(维基百科)

非正式的:非阻塞与阻塞相比,最有利的功能之一是,操作系统不必挂起/唤醒线程。这样的开销可能长达1毫秒到10毫秒,因此消除这种开销可以大大提高性能。在Java中,这还意味着您可以选择使用非公平锁定,这比公平锁定具有更多的系统吞吐量。

我听说这在Java中可用。是否有任何特殊情况我们应该使用此功能

是的,来自Java5。实际上,在Java中,您基本上应该尝试尽可能多地使用java.util.concurrent来满足您的需求(碰巧经常使用非阻塞并发,但是在大多数情况下您不必明确担心)。仅当您没有其他选择时,才应使用同步包装器(.synchronizedList()等)或手动synchronize关键字。这样一来,您大多数时候都会使用更可维护,性能更好的应用程序。

当存在大量争用时,非阻塞并发特别有利。当您需要阻塞时(公平锁定,事件驱动的东西,最大长度的队列等),您不能使用它,但是如果您不需要它,则非阻塞并发往往会在大多数情况下表现更好。

使用这些方法之一进行收集是否有区别/优势。权衡是什么

两者具有相同的行为(字节码应相等)。但我建议使用, Collections.synchronized因为它更短=较小的拧紧空间!

2020-12-03