首页  >  文章  >  Java  >  Java 中的并发

Java 中的并发

PHPz
PHPz原创
2024-08-30 16:18:26300浏览

当今世界,一切都在快速发展。每件事总是有改进的余地。我们的编程语言也是如此。今天,借助现代技术,我们希望事情能够轻松快速地完成。为了同时做几件事,并发的概念出现了。那么什么是并发、它的用途、为什么需要并发等等?我们将尝试在本文中探讨这些问题并单独回答它们。因此,让我们将讨论引向一个非常基本的共同部分:并发的定义。在本主题中,我们将了解 Java 中的并发性。

Java 中的并发

开始您的免费软件开发课程

网络开发、编程语言、软件测试及其他

并发的定义?

那么并发到底是什么?好吧,为了回答这个问题,让我们来看一个常见的场景。假设在阅读本文时,您尝试同时做多件事;也许您正在尝试做笔记,或者您正在尝试理解它或思考一些事情。简而言之,您正在尝试并行执行多项操作。这就是并发的含义。并发只是并行执行多个任务。我们将在本文中讨论 Java 作为编程语言的范围内的并发性。

同时,让我们对线程有一个基本的定义。其实,在Java或者一般的任何编程语言中,负责承载并发的都是线程。这些线程的基本作用是促进任务的并行执行。

那么,什么是线程?

线程是一个轻量级进程,拥有自己的调用堆栈。但是,线程可以访问同一进程下执行的其他线程的共享数据。我们可以在 Java 应用程序中使用多个线程来实现并行处理或并发。

现在让我们进入下一个话题,那就是……

Java 中的并发定义?

因此,所有 OOP 语言在 Java 或任何其他编程语言(如 C#)中都有线程概念。在Java中,我们有不同的进程,通过创建不同的线程来运行以实现并发。

在这个简单的定义之后,让我们讨论我们的新主题,即:

是什么让 Java 应用程序并发?

使 Java 应用程序并发所需的第一个类是 java.lang.Thread 类。 Java.lang.Thread 类负责 Java 编程语言中的所有并发概念。之后,我们有 java.lang.Runnable 接口来从线程类中抽象出线程行为。

我们需要构建高级应用程序的其他类将使用 Java 1.5 中添加的 java.util.concurrent 包。

现在,我们遇到了一个新问题......

Java 并发真的那么简单吗?

看来在Java中实现并发是相当简单的。然而,事实并非如此。让我们来看看吧。

我们上面的讨论通常给人的印象是并发是一个简单、好的概念并且很容易实现。好吧,假设我们更好地监控它并尝试理解它。那么,就需要对基本概念有很好的理解,并且对我们必须实现的目标有一个透彻的理解。

让我们比较一下并发应用程序和单线程应用程序。我们通常发现并发应用程序在设计和理解方面都很复杂。多线程执行的代码需要特别关注和资源来访问共享数据。由于不正确的线程同步而弹出的错误很难调试和修复。而且,在大多数情况下,这些错误在初始阶段并没有被识别出来;它是在生产模式下检测到的,这更难重现。

除了错误和常见缺陷之外,并发线程还需要更多资源来运行应用程序。

并发中的问题与改进——举例说明

所以基本上,由于并发而分配了两种类型的问题。这些问题大致可以分为两类

  • 线程干扰错误
  • 内存一致性错误

让我们了解每一个。

线程干扰错误

让我们通过一个简单的例子来理解。

假设我们有一个计数器函数,其基本作用是增加计数器或数字的计数。假设我们有线程 A 和线程 B,线程 A 读取的初始值为 0。现在,以下步骤按顺序运行。

  1. 线程A读取初始值为0
  2. 线程B读取初始值为0
  3. 线程 A 将值增加 1。新值现在为 1
  4. 线程 B 也并行地将值增加到 1。
  5. 线程 A 将更新后的值 1 写入内存单元
  6. 线程B也重复同样的步骤,将内存单元写入更新值1

所以问题就出现了。两个线程 A & B 执行代码两次,期望值是 2,但反映为 1。这是多线程可能导致的主要问题。

如何解决这个问题?

线程干扰错误可以通过同步访问共享变量来解决。我们必须与共享数据之间的更新值保持同步。

有了这个,让我们看看第二种类型的错误......

内存一致性错误

内存不一致错误通常发生在不同线程尝试读取同一数据或对同一数据的视图不一致时。这通常发生在第一个线程更新一些共享数据时。此更新值不会传播到第二个或不同的线程,它们会读取旧数据。

让我们看看为什么会发生这种情况。

嗯,造成这种情况的原因可能有很多。通常,编译器通常会对应用程序进行多次优化以提高性能。它还可以更新指令序列以优化性能。即使一般情况下,处理器也会尝试优化代码;例如,CPU 可能会从高速缓存或临时寄存器而不是主内存中读取变量的当前值。

结论

并发性是任何 OOP 语言的一个非常重要的特性。线程允许我们并行执行多个进程。它帮助我们更快地执行复杂的任务。然而,并发也有一些缺点。使用线程会导致资源的大量使用。

以上是Java 中的并发的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn