java线程间的互斥

解密Java多线程同步:掌握线程间同步与互斥技巧 在现代软件开发中,多线程是一项重要的技术,而线程间的同步与互斥是其中关键的一部分。本文将揭秘Java多线程同步的奥秘,帮助读者掌握线程间同步与互斥技巧。本文将全面解析Java多线程同步技术,包括线程间通信、锁、条件变量等。我们将深入讨论如何实现线程的同步与互斥,以及应对线程安全问题的技巧。多线程编程中,线程间的同步与互斥是保证数据一致性和程序正确性的关键。在本节中,我们将简要介绍多线程编程的挑战和线程间同步的重要性。在本节中,我们将详细介绍Java中与线程同步相关的类和方法。 阅读详情

今天讲讲线程之间的互斥,也就是说让线程不能同时操作某一个变量,不然会产生预想不到的结果,如果







上面图中一个线程是向账户中添加200元钱,一个线程是向账户中扣除300?原账户中余额为1000;

如果按正常的是账户还有900,但是现在是二个线程同时操作一个账户的余额,如果线程1加了200,那么这个时候账户1200,但是在这个时候线程2没有得到执行的时间,也就是说cpu这个时候去处理其他的线程了,这个时候用户看到的账户余额就是1200了,而不是900,所以这就是多线程操作同一变量带来的结果,今天就讲讲这个问题的处理方法

现在模拟写段代码,让它出现异常的情况,然后再去解决;

public class TraditionThread {
public static void main(String[] args) {
new TraditionThread().init();
}
public void init(){
final OutPuter outputer = new OutPuter();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {

Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.outputer("huawuque");
}
}
}){}.start();

new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.outputer("zhangsanfeng");
}

}
}){}.start();
}
class OutPuter{
public void outputer(String name){
   int len = name.length();
for(int i=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();//换行
}
}

这是二个线程同时打印出名字,

结果:

huawuque
zhangsanfeng
huawuque
zhangsanfeng
huawuque
zhangsanfeng
huawuque
zhangsanfeng
huawuque
zhangsanfeng
huawuque
zhangsanfeng
huawuque
zhangsanfeng
zhhuaanwgusqaunfeng
e
huawuque
zhangsanfeng

我们看到其中有一个打印出来了一个e的,这肯定不是我们想要的,我们想要的肯定是能打印出完整的名字,也就是说让一个线程执行完再执行下一个线程中的代码,这样 就可以保证每个名字都能完整的输出,也就是说让共同的代码实现原子性,所谓原子性就是在某一时刻只能由一个线程执行,


那么在上述代码中我们只要把

for(int i=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();//换行

这段代码实现原子性就可以避免之前发生的事,

在java中解决线程的同步有二个方法

1;代码块同步

synchronized同步的关键词,同步的原理是枷锁,当一个线程进来,锁就锁住了,起来线程进来首先得判断锁是否存在,存在就在外面等,不存在才能执行其代码,

注意;锁一定要准备唯一性,不然起不到作用,锁可以是任意对象

2:方法区同步

如果要同步的代码封装在一个方法里,可以直接在方法上加synchronized关键字,方法上同步锁的对象是用this


如果方法是静态方法,那么锁就是当前类.class,因为静态方法是类可以直接调用,而不需要对象,而类就直接加载到内存中,







java实现多线程间的同步与互斥(读者写者问题) 用java实现多线程并发中的读者与写者问题,能够实现多线程对临界资源的同步有序访问。 具体实现为: 给定一个队列A[1-10][1-100000]、元素编号1-10,其中每个元素包含10万个随机数。创建若干个线程,各循环100次;其中10,100个为读线程,10,100个为更新线程。 1. 读线程每次产生随机数三元组:(i, j, k),其中i: [1-10], j: [1-100000],k[j-100000],求取指定A[i]一级数组中第j到第k个元素的均值; 2. 更新线程每次产生一对随机整数三元组 (i, j, k) 和一个随机浮点数d:(0-1),其中i: [1-10], j: [1-100000],k[j-100000],完成对A[i][j]到A[i][k]之间的所有元素进行数值更新,x = x * (1 + d) 立即下载

相关推荐

Windows 11 上 WSL2 安装 Ubuntu 22.04 保姆级教程(含桌面环境配置)

本文提供在Windows 11上通过WSL2安装Ubuntu 22.04并配置桌面环境的详细教程。涵盖WSL2核心安装、性能调优、Xfce桌面环境部署以及开发环境集成,帮助开发者构建高效、无缝的Windows-Linux混合开发工作站。

Jerry的专栏 633

Java中实现互斥的四种方式

在Java中,实现互斥(即确保同一时间只有一个线程可以访问共享资源),实现互斥有synchronized、lock、semaphore和原子类

Coder-thinking的博客 800

5分钟搞定!用OpenCV实现全景图像柱面展开的保姆级教程(附完整代码)

本文提供了一份使用OpenCV实现全景图像柱面展开的详细教程。通过清晰的数学原理讲解和分步代码演示,指导读者快速掌握从等距柱状投影全景图到平面展开图的核心转换方法,并涵盖性能优化、参数调整及透视视图扩展等实用技巧,适合图像处理爱好者和开发者实践。

sony5的博客 571

详解线程同步和线程互斥,Java如何实现线程同步和互斥

首先第一个问题,为什么进行线程同步和线程互斥?最开始我们的操作系统的作业的调度单位是进程,但是由于每个进程都单独占据一个资源,而且进程的形态转换非常的耗费系统资源。为了系统的调度更加轻量级,能够更好的支持并发,因此引入了线程这个概念。

weixin_74412978的博客 774

[官方培训]07-UE材质基础 孙丹璐 Epic 笔记

勾选允许自定义深度写入再在模型上勾选然后可以通过Scene Texture节点拿到渲染的自定义深度信息,有了自定义深度信息就可以与当前渲染的像素深度进行对比,自定义深度信息存放的是最靠近我们的深度,如果当前像素离自定义深度比较远我们就不要这个像素。效果如下这种方案的缺点也很明显,因为这样看不到第二层的透明了,如果是两层的半透明的裙摆,这样就看不到第二层的裙摆了。对于半透明排序问题最根本能解决的还是光线追踪,ue5中又加入了OIT(基于像素的排序)。官方透明材质的理解和应用。

Tcohneyn的博客 1562

Win11右键菜单显示更多选项设置默认展开方法

在Windows 11操作系统中,用户可能会发现右键点击桌面空白处时,弹出的菜单中仅显示“显示更多选项”,而并非直接展示所有可用的选项。这对于希望快速访问特定功能的用户来说,无疑增加了一些不便。为了优化这一体验,本文将介绍两种简单的方法,帮助用户设置Win11右键菜单,使其默认展开包含的所有选项。通过上述两种方法,用户可以轻松地将Win11右键菜单设置为默认展开所有选项,从而提高工作效率和便捷性。希望这篇文章对你有所帮助!

nntxthml的博客 1万+

【Java 基础篇】Java 线程的同步与互斥详解

竞态条件(Race Condition):多个线程在不同的时刻访问同一个资源,导致数据不一致或错误的结果。数据争用(Data Race):多个线程同时读写共享数据,可能导致数据的不一致性。死锁(Deadlock):多个线程互相等待对方释放资源,导致所有线程无法继续执行。饥饿(Starvation):某些线程无法获得所需的资源,导致一直无法执行。线程安全的代码是指在多线程环境下,不管多少线程并发访问,都能保证程序的正确性和一致性。线程安全的代码不会出现上述问题。

繁依Fanyi的博客 1143

【2025年五一数学建模竞赛】A题 完整论文 模型建立与求解

2025年五一数学建模竞赛 A题:基于历史数据与模式识别的道路车流量推测模型研究

Magnolia_He的博客 3783

Java中线程的互斥处理

线程的互斥处理 互斥:如果一个线程正在执行某一个操作,那么其它的线程就不可以再执行这部分操作。在Java中使用关键字synchronized来执行线程的互斥处理。 synchronized方法:如果声明一个方法时,在前面加上关键字synchronized,那么这个方法就只能由一个线程运行。只能由一个线程运行是每次只能由一个线程运行的意思,并不是说仅能让某一个特定的线程运行。这种方法称为synchronized方法。有时也称为同步方法 下面通过代码的形式来理解互斥。 在这里插入代码片 public stat

Waiting的博客 1608

基于 ESP32 的智能环境监测与远程报警系统

本系统基于 ESP32 实现了环境数据的采集、远程传输、报警通知功能,硬件成本低、接线简单、代码可直接运行。用户可根据实际需求调整传感器类型(如替换为 PM2.5 传感器、土壤湿度传感器)和功能扩展,适合嵌入式 IoT 入门学习和实际场景应用。通过多轮迭代(如优化低功耗、增加 APP 控制),可进一步提升系统的实用性和稳定性。

weixin_42300449的博客 1024

信创服务器(麒麟 V10 SP3)安装 NVIDIA GeForce RTX 5070 驱动

本文介绍了在麒麟V10 SP3系统上安装NVIDIA RTX 5070显卡驱动的详细步骤。首先需要关闭nouveau驱动,安装必要的编译环境和工具,确保内核版本与kernel-devel完全一致。最后运行NVIDIA驱动安装程序,关键选择包括启用DKMS支持、编译模块、禁用32位兼容和nouveau驱动。整个流程适用于海光CPU和Blackwell架构GPU的国产操作系统环境。

猿小白的博客 669

Java多线程互斥及其区别

可以使用 lockInterruptibly() 方法获取锁,当线程在等待获取锁的过程中被中断时,会抛出 InterruptedException 异常。可重入意味着同一个线程可以多次获取同一把锁,而非公平锁表示线程获取锁的顺序是不确定的。Lock 接口:在高并发场景下,Lock 接口的性能可能会更好,因为它提供了更多的优化选项,例如锁的粒度控制、锁的超时机制等。综上所述,synchronized 关键字适用于简单的同步场景,而 Lock 接口适用于复杂的同步场景,需要更多的锁控制和灵活性。

liu094的博客 849

23、微波电路中的过孔、过孔围栏与接地焊盘建模分析

本文详细分析了微波电路设计中过孔、过孔围栏及接地焊盘的建模与优化方法。探讨了过孔模型的发展及其电感与电容特性,通过场求解器和集总元件模型提高建模精度。此外,分析了过孔隔离围栏在改善信号隔离中的作用,并通过2.5D和3D电磁仿真验证其效果。最后,研究了接地焊盘中过孔布局对电路稳定性的影响,提出了优化过孔位置以消除谐振和杂散振荡的方法。文章为微波电路设计提供了重要的理论支持和实践指导。

convnet3designer的博客 164

Java线程间的资源互斥共享

在一些同时运行的线程需要共享数据时,每个线程就必须要考虑与他一起共享数据的线程的状态与行为,否则的话就不能保证共享数据的一致性,从而也就不能保证程序的正确性。在Java语言中,引入了“对象互斥锁”的概念(又称为监视器、管程)来实现不同线程对共享数据操作的同步。

百彦子烨的博客 5844

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java 之 读写锁 线程间互斥

import java.util.Random; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 线程间互斥 * @author ETHAN * */ public class ReadWriteLockTest

ETHAN IN IT 1995

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java多线程——ThreadLocal实现线程内的共享,和线程间的互斥

在日常的开发中,都会遇到多线程的问题:1、一个线程操作读取到另外一个线程的数据。2、在同一个线程之内,多个方法读取到的同一个数据不一样小编就曾遇到过,开启多个线程的时候,线程之间的数据传递出现串行的情况。下面是一个简单的demo。import java.io.DataOutputStream; import java.util.Random; import org.junit.Test; /*...

wiliam_mountain的博客 1463

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java 多线程(一)线程间的互斥和同步通信

Java 多线程 系列文章目录: Java 多线程(一)线程间的互斥和同步通信 Java 多线程(二)同步线程分组问题 Java 多线程(三)线程池入门 Callable 和 Future Java 多线程(四)ThreadPoolExecutor 线程池各参数的意义 Java 多线程(五)Lock 和 Condition 实现线程同步通信 Java 多线程(六)Semaphore 实...

Chiclaim 4920

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.youkuaiyun.com/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印

火侬智能科技 333

java实现线程互斥的方式_C语言描述线程间的同步与互斥

一、实现线程间同步互斥的操作1、线程间同步 ==== 有序执行法1、多个信号量  法2、条件变量+互斥锁 ===>broadcast signal2、线程间互斥 ==== "你死我活"法1、单个信号量  法2、互斥锁//1、互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。//2、同步是指在互斥的基础上(大多数情况),...

weixin_30624767的博客 459

《五》多线程基础——Java线程间的通信(互斥与协作)

多线程基础——Java线程间的通信(互斥与协作)1、锁与同步   在Java中,锁的概念都是基于对象的,所以我们⼜经常称它为对象锁。线程同步听着很高大上,cao,被吓了一跳,其实就是让线程之间按照⼀定的顺序执⾏。怎么实现呢?我们可以使⽤锁来实现它。Java多线程的等待/通知机制是基于 Object 类的 wait() ⽅法和 notify() ,notifyAll() ⽅法来实现的。notify()⽅法会随机叫醒⼀个正在等待的线程,⽽notifyAll()会叫醒所有正在等待的线程。sleep() join(

xgb2018的博客 550

多线程系列二——java线程间的互斥与同步

“线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。”   我们可以用银行转账的例子加以说明: 1、甲乙两用户对银行同一账户进行操作,余额为1000元; 2、甲用户将银行余额1000元读取到本地,进行取款操作。在进行取款过程中,乙用户向银行账户进行存款300元操作并将账户余额更新,而此时甲用户进行取款是建立在原始

Flash~ 1367

java中的多线程——线程创建方式、线程互斥和线程间通信

线程创建方式 1.使用 Thread(Runnable target)这个构造方法创建Thread对象,传入一个实现Runnable接口的对象。实现Runnable接口要实现Run方法,所以这种方法创建的线程运行时,会执行这个Runnable接口上的Run方法。 2.定义Thread子类,重写run方法,当这个线程执行时,会执行已重写的run方法。 面试题:以下代码的输出语句是 publi

元新星的博客 707

Java基础(32)——多线程相关知识详解及示例分析四(线程间的互斥)

Java基础(32)——多线程相关知识详解及示例分析四(线程间的互斥)版权声明一、线程间的互斥1、为什么需要实现线程间的互斥(1)共享数据(2)如果线程对共享数据只有读操作,没有写操作(更改操作) 版权声明 本文原创作者:清风不渡 博客地址:https://blog.youkuaiyun.com/WXKKang 一、线程间的互斥 1、为什么需要实现线程间的互斥   我们知道,线程会有多个并发运行的情况,那么,当多个并发的线程需要使用共享数据时,我们就必须需要考虑使用共享数据的线程状态与行为,否则就不能保证共享数

清风不渡 341

Java多线程编程-首篇 线程进程 同步异步 线程间的互斥与同步 阻塞非阻塞

本文主要介绍多线程的几个基本概念,分清概念的同时对多线程编程才会有更加深入的了解 线程进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线...

^_^记录成为更好的自己 407

Java开发基础-线程-线程互斥锁—09

由于篇幅原因,就不多做展示了《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!片转存中…(img-ruYnrBzs-1712612406807)][外链图片转存中…(img-JljEcAYU-1712612406808)]由于篇幅原因,就不多做展示了《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84048149的博客 1010
上一篇: 一次酒店宴席安排宾客就座吃饭,5人一桌剩4人,7人一桌剩6人,9人一桌剩8人,11人一桌正好。问宴席共最少有多少人
下一篇: 菜鸟自己实现一个多线程操作对象中的同一个数据
zhoushenxian
博客等级 码龄12年 453粉丝 549原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值