当前位置: 首页 > 面试题库 >

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

边翔宇
2023-03-14
问题内容
  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();

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


问题答案:

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

正式:

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

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

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

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

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

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

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



 类似资料:
  • 9.7. 示例: 并发的非阻塞缓存 本节中我们会做一个无阻塞的缓存,这种工具可以帮助我们来解决现实世界中并发程序出现但没有现成的库可以解决的问题。这个问题叫作缓存(memoizing)函数(译注:Memoization的定义: memoization 一词是Donald Michie 根据拉丁语memorandum杜撰的一个词。相应的动词、过去分词、ing形式有memoiz、memoized、me

  • 具有offer和flush的非阻塞并发队列 我需要一个基本上只有2个操作的无界非阻塞并发队列: 提供:在此队列的尾部自动插入指定项; flush:获取队列中在该时刻出现的所有项,并开始按照插入顺序逐一处理它们。更具体地说,必须是原子的只是这个“TakeAll”操作,它将是flush的第一个操作。takeAll之后提供给队列的所有项都将被插入,然后仅由另一个后续刷新处理。 目标是使用者在takeAl

  • 我希望实现具有以下特征的数据结构: 推送:将元素添加到列表的前面。 读取 :读取列表中的所有元素 < li >固定大小:列表不应超过指定的阈值,如果超过该阈值,它应自动从末尾(最早的项目)截断。这不需要严格执行,但是一旦列表超过阈值,它最终会被截断。 < li >并发安全:该结构应该安全地容纳多个并行推送器和读取器 < li >非阻塞:这是真正的问题。我想使用不带锁的实现。如果可能的话,许多线程应

  • 使用PEP 557,将数据类引入python标准库。 它们使用了装饰器,它们应该是“带默认值的可变名称耦合”,但我不太清楚这到底意味着什么,以及它们与普通类的区别。 python数据类到底是什么?什么时候最好使用它们?

  • 我有很多RxJava可观察对象(要么是从Jersey客户端生成的,要么是使用)生成的存根)。它们都应该只发出一个值。我有一个组件测试,模拟了所有Jersey客户端,并使用了,我看到的行为与运行生产代码时的行为相同。 我有几个类,作用于这些可观察的,执行一些计算( 有一次,在一个这样的类中,我试图压缩我的几个源观测值,然后映射它们——如下所示: 然后将所有计算类合并并等待: 麻烦的是,永远不会执行。

  • 主要内容:线程的生命周期,线程优先级,通过实现Runnable接口创建一个线程,通过扩展Thread类创建一个线程Java是一种多线程编程语言,我们可以使用Java来开发多线程程序。 多线程程序包含两个或多个可同时运行的部分,每个部分可以同时处理不同的任务,从而能更好地利用可用资源,特别是当您的计算机有多个CPU时。多线程使您能够写入多个活动,可以在同一程序中同时进行操作处理。 根据定义,多任务是当多个进程共享,如CPU处理公共资源。 多线程将多任务的概念扩展到可以将单个应用程序中的特定操作细分