【JAVA并发】二、JAVA是如何解决并发问题的

article/2025/11/7 11:39:51

上文提到了并发产生的原因,那么JAVA给出的解决方案是什么呢,我们来一起探讨一下。

一、解决缓存导致的并发问题

针对于这个问题,原因主要是各个缓存之间的数据可见性的问题。那么解决这个问题的最简单粗暴的思路就是禁用缓存

![!](https://img-blog.csdnimg.cn/403668558cc741268410d40f2874c9fe.jpeg

试想一下,内存只有一个区域且对任何CPU都是可见的,如果给某个数据打上个标签,让这种类型的数据不进缓存里面,读写操作都直接在内存上操作。那么是不是这个可见性的问题就解决了?

Volatile的原理就是这个意思。用volatile修饰对象,就等于告诉编译器,对这个变量的读写,不能使用 CPU 缓存,必须从内存中读取或者写入。

二、解决原子性问题

原子性问题的产生原因在于线程切换,线程切换是操作系统上控制的,这个就不是一个JAVA或者说是JAVA虚拟机能控制得住的事情了。既然不能阻止他发送线程切换,那我们如果在某些会产生线程安全问题的地方加一个限制,这个限制就是当运行到这段代码的时候,最多有且只能有一个线程完全的执行完成后,其他线程才能排队执行,是不是就解决问题了呢?

举个例子现实中的例子,一座独木桥,桥身只能承受一个人的重量,且每次只能允许一个人通过。就算桥的主人赋予了某个人优先通过的权利(即发生了线程切换),但是由于前一个人还在桥上没走完。这个被予以优先通过权利的人也得等和正在桥上的人走完才能继续过桥。

同一时刻只有一个线程执行的特性,就是互斥性。只要保证对对象的修改是互斥的,我们就能保证他的原子性了。

JAVA在实现互斥的方式就是上。在JAVA里面,锁的类型可以分为两类,分别是显示锁隐式锁。显示锁就是各种Lock对象,包括经常看到的可重入的ReentrantLock,读写锁ReentrantReadWriteLock等等。隐式锁指的就是synchronized关键字了。

针对显示锁跟隐式锁的优劣:

显示锁的优点在于锁的加锁和解锁都是认为控制,灵活度较好,劣势就在于便捷性较差了。
隐式锁的优点就在于用着方便,加锁解锁都是默认给定好了的,不存在加了锁后忘记解锁的情况。劣势就在于由于不能人为操控解锁,一些需要提前解锁的场景就没法用syn关键字实现了。

三、 解决编译优化带来的问题

编译优化这个就很底层了,如果完全禁用编译优化,那有点捡了芝麻丢了西瓜的感觉。那么JAVA是如何解决这个问题的呢,答案就是Happens-Before 规则。引用一下别人的话:

Happens-Before 约束了编译器的优化行为,虽允许编译器优化,但是要求编译器优化后一定遵守 Happens-Before 规则。

Happens-Before 翻译过来也就是 “发生在什么之前”,在JAVA里面的含义也就是,如果 A Happens-Before B (即是A和B 满足Happens-Before 规则) ,也就是A 发生在B之前,那么A对B来说就是可见的。

下面简述并记录一下Happens-Before 规则:

1、程序顺序规则:一个线程中的每个操作,happens-before于随后该线程中的任意后续操作
2、监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的获取
3、volatile变量规则:对一个volatile域的写,happens-before于对这个变量的读 4、传递性:如果A
happens-before B,B happens-before C,那么A happens-before C
5、start规则:如果线程A执行线程B的start方法,那么线程A的ThreadB.start()happens-before于线程B的任意操作
6、join规则:如果线程A执行线程B的join方法,那么线程B的任意操作happens-before于线程A从TreadB.join()方法成功返回。


http://chatgpt.dhexx.cn/article/8L6OkIrM.shtml

相关文章

java并发编程Future类详解

作用和举例 future类的作用就是为了调用其他线程完成好后的结果,再返回到当前线程中,如上图举例: 小王自己是主线程,叫外卖等于使用future类,叫好外卖后小王就接着干自己的事去了,当外卖到了的时候&#x…

Java并发工具CountDownLatch使用详解

本文目录 1、使用场景2、使用介绍3、使用案例4、 Thread.join()和CountDownLatch的区别 1、使用场景 通过使用 CountDownLatch可以使当前线程阻塞,等待其他线程完成给定任务。可以类比旅游团导游要等待所有的游客到齐后才能去下一个景点。 CountDownLatch 主要应用…

Java 并发编程(一):简介

这篇文章的标题原本叫做——Java 并发编程(一):简介,作者名叫小二。但我在接到投稿时觉得这标题不够新颖,不够吸引读者的眼球,就在发文的时候强行修改了标题(也不咋滴)。 小二是一名 Java 程序员&#xff…

Java并发编程的艺术下载

本书简介 并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技术社区,得…

Java并发工具之Semaphore

一、简介 摘自《Java并发编程的艺术》一书 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。 Semaphore一般用于流量的控制,特别是公共资源有限的应用场景。例…

Java 并发编程实战-创建和执行任务的最佳实践

若无法通过并行流实现并发,则必须创建并运行自己的任务。运行任务的理想Java 8方法就是CompletableFuture。 Java并发的历史始于非常原始和有问题的机制,并且充满各种尝试的优化。本文将展示一个规范形式,表示创建和运行任务的最简单&#x…

java并发-java并发大师

文章目录 java并发大师James GoslingDoug Lea 参考 java并发大师 聊聊java(十)Java并发大师Brain Goetz和Doug Lea 的中英文博客文章地址 参考URL: https://blog.csdn.net/weixin_33963594/article/details/92481739 James Gosling 技术大牛收割机&am…

java并发编程之 并发问题及解决方法

一、并发问题的根源 首先,我们要知道并发要解决的是什么问题?并发要解决的是单进程情况下硬件资源无法充分利用的问题。而造成这一问题的主要原因是CPU-内存-磁盘三者之间速度差异实在太大。如果将CPU的速度比作火箭的速度,那么内存的速度就…

『图解Java并发编程系列』10张图告诉你Java并发多线程那些破事

目录 线程安全问题 活跃性问题 性能问题 有态度的总结 头发很多的程序员:『师父,这个批量处理接口太慢了,有什么办法可以优化?』架构师:『试试使用多线程优化』第二天头发很多的程序员:『师父&#xff…

Java基础-并发篇

3.1. JAVA 并发知识库 3.2. JAVA 线程实现/创建方式 3.2.1. 继承 Thread 类 ​ Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方 法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将…

java并发总结

一、并发基础 ㅤ 1、进程与线程 ㅤ 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 I…

pytorch 图片分类,python 图片分类,resnet18 图片分类

pytorch 图片分类,python 图片分类,resnet18 图片分类,深度学习 图片分类 pytorch版本:1.5.0cu101 全部源码,可以直接运行。 下载地址:https://download.csdn.net/download/TangLingBo/12598435 网络是…

深度学习图片分类实战学习

开始记录学习深度学习的点点滴滴 深度学习图片分类实战学习 前言一、深度学习二、使用步骤1. 自建网络模型2. 进行深度学习的学习迁移 注意事项 前言 随着人工智能的不断发展,这门技术也越来越重要,很多人都开启了学习人工智能,本人开始记录…

关于图片的多标签分类(1)

最近还在处理人脸附件(眼镜,刘海,口罩,帽子)的multi-label分类。给自己普及一下常识性问题: 1)什么是multi-label分类? multi-label分类,常见一张图片中可以存在多个目…

svm实现图片分类(python)

目录 前言 knn vs. svm svm & linear classifier bias trick loss function regularization optimization 代码主体 导入数据及预处理 svm计算loss_function和梯度 验证梯度公式是否正确 比较运行时间 svm训练及预测,结果可视化 通过corss-validat…

图片分类-python

目的:做一个简易的图片分类。 使用到的算法:hog、surfsvm 图片集:cifar-10、cifar-100、stl-10、自制图片集 分类完整代码链接 使用说明: 1.cifar-10、cifar-100和stl-10直接解压 2.自制图片集文件夹结构: ├…

CNN图片分类

最近在阅读一些AI项目,写入markdown,持续更新,算是之后也能回想起做法 项目 https://github.com/calssion/Fun_AI image classify(图片分类) CNN classify dogs and cats(猫狗二分类) Tutorial(教程):https://developers.google.com/mach…

深度学习之图像分类

第一篇CSDN文章,写的不好,还请各位大佬指正。万事开头难,千里之行始于足下! 1.什么是图像分类 图像分类,核心是从给定的分类集合中给图像分配一个标签的任务。实际上,这意味着我们的任务是分析一个输入图…

关于图像分类

https://www.zhihu.com/question/57075015/answer/194397802https://www.zhihu.com/question/57075015/answer/194397802 先定义一下图像分类,一般而言,图像分类分为通用类别分类以及细粒度图像分类 那什么是通用类别以及细粒度类别呢?这里…

(一)图像分类任务介绍 Image Classification

目录 一、什么是图像分类任务?它有哪些应用场景? 二、图像分类任务的难点? 三、基于规则的方法是否可行? 四、什么是数据驱动的图像分类范式? 数据集构建 分类器设计与学习 分类器决策 五、常用的分类任务评价指…