【并发编程特性】并发编程特性之五种特性的探讨

简介: 【并发编程特性】并发编程特性之五种特性的探讨

前言

编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中存在更多容易出错的地方。那么,为何我们还要使用并发程序?线程是Java语言中不可或缺的重要功能,它们能使复杂的异步代码变得简单,从而极大地简化了复杂系统的开发。

JMM内存图:

image-71510711796248f9a5f702cb3f7494ca.png

一、共享性

  1. 数据共享性是线程安全的主要原因之一。
  2. 如果所有的数据只是在线程内有效,那就不存在线程安全性问题,3. 这也是我们在编程的时候经常不需要考虑线程安全的主要原因之一。
  3. 在多线程编程中,数据共享是不可避免的。
  4. 最典型的场景是数据库中的数据,为了保证数据的一致性,我们通常需要共享同一个数据库中数据

二、互斥性

  1. 资源互斥是指同时只允许一个访问者对其进行访问,具有唯一性和排它性。
  2. 我们通常允许多个线程同时对数据进行读操作,但同一时间内只允许一个线程对数据进行写操作。
  3. 所以我们通常将锁分为共享锁和排它锁,也叫做读锁和写锁。
  4. 如果资源不具有互斥性,即使是共享资源,我们也不需要担心线程安全。
  5. 对于不可变的数据共享,所有线程都只能对其进行读操作,所以不用考虑线程安全问题。
  6. 但是对共享数据的写操作,一般就需要保证互斥性

三、可见性

  1. 线程只能操作自己工作空间中的数据
  2. 每个工作线程都有自己的工作内存,所以当某个线程修改完某个变量之后,在其他的线程中,未必能观察到该变量已经被修改。
  3. 如何保证可见性?

一、 使用 volatile 关键字

1、 volatile关键字要求被修改之后的变量要求立即更新到主内存,每次使用前从主内存处进行读取。

2、当修饰引用类型的时候, 只能保证引用本身的可见性, 不能保证内部字段的可见性

二、 使用 synchronized加锁

1、synchronization它会保证unlock之前必须先将变量重新刷入主内存当中。

从而达到多个线程确保从主内存当中拿到的数据一致

代码示例:

四、原子性

一、 原子性就是指对数据的操作是一个独立的、不可分割的整体。换句话说,就是一次操作,是一个连续不可中断的过程,数据不会执行的一半的时候被其他线程所修改。

二、 示例

1.X = 5

是一个写操作

具有原子性

2.Y = X

不具有原子性

先把数据X读取工作空间

再把X值写给Y

是一个读写操作, 不具有原子性

3.i++

不具有原子性

读i到工作空间

+1后写到给i

刷新结果到内存

4.a = a + 1

不具有原子性

读a到工作空间

+1

刷新结果到内存

三、如何保证原子性

Synchronized

JUC Lock加锁

被synchronized关键字或其他锁包裹起来的操作也可以认为是原子的。从一个线程观察另外一个线程的时候,看到的都是一个个原子性的操作。

相关文章
|
6月前
|
缓存
并发编程的三大特性之可见性
并发编程的三大特性之可见性
32 0
|
3月前
|
监控 Java 测试技术
Java并发编程最佳实践:设计高性能的多线程系统
Java并发编程最佳实践:设计高性能的多线程系统
65 1
|
24天前
|
并行计算 安全 Go
Go语言的并发特性
【10月更文挑战第26天】Go语言的并发特性
12 1
|
6月前
|
存储 Java 程序员
C++多线程编程基础
C++多线程编程基础
57 2
|
1月前
|
负载均衡 安全 物联网
探索Go语言的并发编程模型及其在现代应用中的优势
【10月更文挑战第10天】探索Go语言的并发编程模型及其在现代应用中的优势
|
2月前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue<T>`和`ConcurrentDictionary<TKey, TValue>`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
48 1
|
2月前
|
监控 Java 开发者
【并发编程的终极简化】JDK 22结构化并发:让并发编程变得像写代码一样简单!
【9月更文挑战第8天】随着JDK 22的发布,结构化并发为Java编程带来了全新的并发编程体验。它不仅简化了并发编程的复杂性,提高了程序的可靠性和可观察性,还为开发者们提供了更加高效、简单的并发编程方式。我们相信,在未来的发展中,结构化并发将成为Java并发编程的主流方式之一,推动Java编程语言的进一步发展。让我们共同期待Java在并发编程领域的更多创新和突破!
|
4月前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
51 0
|
5月前
|
存储 Java 调度
深入探索Java并发编程:ConcurrentSkipListSet的高效使用与实现原理
深入探索Java并发编程:ConcurrentSkipListSet的高效使用与实现原理
|
6月前
|
安全 Java
并发编程的三大特性之有序性
并发编程的三大特性之有序性
31 0
下一篇
无影云桌面