Java 中的竞态条件10 Sept 2024 | 4 分钟阅读 Java 是一种多线程编程语言,因此发生竞态条件的风险较高。因为同一个资源可能会被多个线程同时访问并可能修改数据。我们可以说竞态条件是一种**并发 bug**。它与**Java 中的死锁**密切相关。在本节中,我们将实现**Java 中的竞态条件**。 什么是竞态条件?关键部分(程序中访问共享内存的部分)被两个或多个线程并发执行的条件。这会导致程序行为不正确。 通俗地说,**竞态条件**可以定义为两个或多个线程为了获取某些共享资源而相互竞争的条件。 例如,如果线程 A 正在从链表中读取数据,而另一个线程 B 正在尝试删除相同的数据。这个过程会导致竞态条件,可能会导致运行时错误。 竞态条件有两种类型
“**读-修改-写**”模式表示多个线程首先读取变量,然后修改给定值,再将其写回该变量。让我们看下面的代码片段。 为什么会发生?当两个或多个线程在没有适当同步的情况下操作同一个对象,并且它们的操作相互干扰时,就会发生这种情况。 竞态条件示例假设有两个进程 A 和 B 在不同的处理器上执行。两个进程都试图并发调用 bankAccount() 函数。我们将传递给函数的共享变量的值是 1000。 考虑,A 调用 bankAccount() 函数,并将 200 作为参数传递。同样,进程 B 也调用 bankAccount() 函数,并将 100 作为参数传递。 结果如下所示
RaceConditionProgram.java 输出 Value for Thread After increment Thread-1 2 Value for Thread at last Thread-1 2 Value for Thread After increment Thread-3 3 Value for Thread at last Thread-3 1 Value for Thread After increment Thread-2 2 Value for Thread at last Thread-2 0 在上面的输出中,我们可以观察到变量 c 给出了错误的值。 如何避免?避免竞态条件的两种解决方案如下。
为了防止竞态条件,应该确保一次只有一个进程可以访问共享数据。这是我们需要同步进程的主要原因。 避免竞态条件的另一种解决方案是互斥。在互斥中,如果一个线程正在使用共享变量或线程,那么另一个线程将排除自己执行相同的操作。 让我们看一个关于此的 Java 程序。 AvoidRaceCondition.java 输出 Value for Thread After increment Thread-1 1 Value for Thread at last Thread-1 0 Value for Thread After increment Thread-3 1 Value for Thread at last Thread-3 0 Value for Thread After increment Thread-2 1 Value for Thread at last Thread-2 0 从输出可以看出,现在线程一次访问一个共享资源。在 run() 方法中同步访问实现了这一点。 下一个主题Java 中的静态数组 |
一个数字的超阶乘是连续数字从 1 到该数字的乘积,其中每个数字都以其幂次表示。数学上,H(p) = 1 ^ 1 × 2 ^ 2 × 3 ^ 3 × 4 ^ 4 × ...
阅读 4 分钟
Java 是一种多功能编程语言,以其管理各种数据结构的灵活性而闻名。Java 中的一个重要概念,称为 padding,在管理内存、成功对齐记录和优化统计处理方面起着至关重要的作用。在本节中,我们将讨论 padding...
5 分钟阅读
最大正方形子矩阵问题是指在一个给定的二进制矩阵中找到最大的正方形子矩阵的大小,其中子矩阵的所有元素都为 1。这是一个经典的动态规划问题,用于高效地解决二维问题。在 Java 中,…
阅读 10 分钟
如何在 Java 中排序列表 我们可以使用以下方法对列表进行排序: 使用 stream.sorted() 方法 使用 Comparator.reverseOrder() 方法 使用 Comparator.naturalOrder() 方法 使用 Collections.reverseOrder() 方法 使用 Collections.sort() 方法 Java Stream 接口 Java Stream 接口提供了两种排序列表的方法:sorted() 方法 Stream 接口提供了一个 sorted() 方法来对列表进行排序...
阅读 3 分钟
编程不仅仅是解决复杂问题或创建功能软件;它也是一种艺术形式。探索编程的艺术一面的一种方法是使用代码创建精美的图案和设计。在本节中,我们将深入探讨迷人的世界……
5 分钟阅读
问题陈述:找到使一个字符串与另一个字符串共享最长公共前缀所需的最少移位次数。输入:str1 = "abcde" str2 = "cdeab" 输出:2 说明:将 str1 向左移两次得到 "cdeab",这与 str2 匹配。方法 1:蛮力... ...
阅读 8 分钟
Socket 是 Java 网络支持的核心概念。Socket 范式是在 20 世纪 80 年代初的 4.2BSD Berkeley UNIX 版本中引入的。因此,它被称为 Berkeley socket。Socket 是现代网络的基础,因为 Socket……
阅读 17 分钟
是一位在 Java 技术方面拥有全栈 Web 应用程序开发专业知识的软件工程师。他们既懂前端开发又懂后端开发,并负责设计、开发和维护满足客户需求的 Web 应用程序。的角色包括...
阅读 6 分钟
异或(XOR)运算,也称为逻辑异或运算,是一种编程中常用的逻辑运算。当且仅当只有一个操作数为真时,它返回真。在 Java 中,XOR 运算可以应用于集合,使我们能够执行...
阅读 4 分钟
Java 泛型引入了参数化类型的概念,这彻底改变了程序员创建 Java 代码的方式。因此,编程进入了一个新的时代,Java 代码更短、更具适应性、类型安全。为了实现这些优势,许多设计模式都利用 Java...
阅读 10 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India