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) 立即下载

相关推荐

STM32驱动SPL06-001气压传感器:I2C通信与温度补偿实战

气压传感器在无人机定高、室内定位和气象监测中至关重要。SPL06-001凭借±0.06 hPa相对精度和I2C接口,成为STM32项目的理想选择。通过I2C总线读取原始数据,并利用出厂校准系数进行温度补偿和气压解算,可输出高精度气压值。本文详细解析SPL06-001的寄存器操作、校准系数拼接及补偿算法,并分享I2C上拉电阻、地址配置等避坑经验,帮助开发者快速实现气压测量与高度解算。

weixin_29188043的博客 337

Java中实现互斥的四种方式

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

Coder-thinking的博客 800

h5支付不能打开支付宝 ios_iOS支付宝H5支付无法返回APP解决方案

本文前大段在讲楼主是如何解决这个问题的,以及中间遇到的麻烦。赶时间的同学可以直接看最后的 最终解决方案。在讨论之前,我们先看看官方文档上的一句话:注意:在iOS系统中,唤起支付宝App支付完成后,不会自动回到浏览器或商户APP。用户可手工切回到浏览器或商户APP;支付宝H5收银台会自动跳转回商户return_url指定的页面。what? 官方直接跟我们说GG了?楼主不甘心,还是想尝试一下。借鉴之前...

weixin_39864101的博客 854

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

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

weixin_74412978的博客 774

语言随机效应模型_线性混合效应模型 VS 方差分析

线性混合效应模型相比方差分析具有很多优点。为了让大家更直观的了解,我们来做一下两者的对比。基于模拟的方法,生成了以下数据dat_sim:这种数据格式是长格式,也就是从实验软件导出来的那种数据格式。这种数据格式可以直接使用线性混合效应模型进行分析。该实验设计是被试内项目间的单因素两水平设计。category是自变量,两个水平分别是outgroup和ingroup,outgroup比ingr...

weixin_31960565的博客 2688

FPGA上跑100G网卡?手把手教你用Xilinx IP核配置RDMA(附避坑指南)

本文详细介绍了如何在Xilinx UltraScale+ FPGA平台上配置100G RDMA网络加速方案,涵盖CMAC和ERNIC IP核的深度配置技巧、硬件架构设计及系统集成。通过实战指南和避坑建议,帮助开发者实现超低延迟、零拷贝的数据传输,显著提升数据中心和高性能计算的网络性能。

weixin_33734785的博客 674

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

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

繁依Fanyi的博客 1143

华为昇腾服务器npu中安装paddle,pytorch等环境,训练代码迁移适配等问题记录

参考文档:https://github.com/PaddlePaddle/PaddleCustomDevice/blob/develop/backends/npu/README_cn.md

qq_29220369的博客 4112

Java中线程的互斥处理

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

Waiting的博客 1608

在 ABAP Cloud 里优雅读取与解析 XML:用 sXML Reader 把接口数据落成结构化 ABAP

ABAP Cloud中XML解析实践 摘要:本文介绍了在ABAP Cloud环境下解析XML数据的最佳实践。针对企业系统中常见的XML格式数据,文章推荐使用sXML库中的CL_SXML_STRING_READER进行流式解析,而非传统的DOM方式。重点解析了命名空间(Namespace)、属性(Attribute)和CDATA等关键概念的处理方法,并比较了两种读取属性的策略:通扫所有属性(NEXT_ATTRIBUTE)和精准取值(GET_ATTRIBUTE_VALUE)。文章提供了完整的ABAP Cloud

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 187

贝叶斯(Bayes)决策理论

在博文【模式识别PR和模式的概念】介绍了相关的模式识别与模式的概念。在本节描述所要讨论的问题之前,再提一下对于待识别的物理对象的描述问题。假设一个待识别的物理对象用其d个属性观察值描述,称之为d个特征,这组成一个d维的特征向量,而这d维待征所有可能的取值范围则组成了一个d维的特征空间。一般地,机器实现自动分类有两大类方法:一种是模板匹配方法,另一种是对特征空间划分为子空间(每类的势力范围)的方法。

松子茶的专栏 3万+

Java多线程互斥及其区别

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

liu094的博客 849

pdb文件删除杂原子 HETATM;保留或去除水分子

这样操作水分子也会跟着删除,如果需要保留水分子。

weixin_42357472的博客 2644

Java线程间的资源互斥共享

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

百彦子烨的博客 5844

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

wiliam_mountain的博客 1463

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、付费专栏及课程。

余额充值