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+迪文屏+WiFi模组的实战解析

本文详细解析了基于STM32微控制器、迪文串口屏和WiFi模组构建物联网监控系统的完整方案。从硬件选型、系统架构设计到数据交互实现,提供了包括迪文屏GUI开发、STM32通信协议、低功耗优化等实战经验,帮助开发者快速掌握物联网监控系统的核心技术。

docker7nomad的博客 727

Java中实现互斥的四种方式

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

Coder-thinking的博客 800

FLUKA软件在Ubuntu的安装指南(亲测有效)

FLUKA其强大的蒙特卡洛模拟能力使得用户能够模拟复杂的辐射相互作用过程

chencheng1127的博客 2885

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

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

weixin_74412978的博客 774

PHP实战:5分钟搞定SM4国密加密算法集成(附完整代码)

本文提供了一份可直接用于生产环境的PHP SM4国密加密算法集成实战指南。文章详细解析了SM4算法核心,对比了ECB与CBC工作模式,并给出了包含完整代码、密钥管理、数据填充及性能优化的解决方案,帮助开发者快速、安全地在PHP项目中集成国密加密算法。

2a4s6d8f0g的博客 339

python多线程实现http代理

python多线程实现http代理文章要求1.py socket模块2.py threading模块3.环境搭建3.1设置代理3.2搭建http简单服务器代码分析1.完整代码2.逻辑结构 文章要求 1.py socket模块 socket模块接触后很简单,我实现的是阻塞性的套接字。 需要了解到,连接套接字,监听套接字,和套接字accept()方法的返回值是元组 数据传递过程sock.recv(1024),sock.send()也不需要转换编码,直接以b"二进制流"传输 2.py threading模块 th

qq_43402663的博客 2508

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

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

繁依Fanyi的博客 1143

HFSS仿真3dB微带双分支定向耦合器学习笔记

设计一个3dB微带双分支定向耦合器,各端口微带线特性阻抗为50Ω,中心频率为5GHz,介质基板的介电常数9.6,基板厚度为0.8mm这里重点讲解HFSS的操作,关于理论知识后面文章更新。

qq_36521926的博客 7767

Java中线程的互斥处理

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

Waiting的博客 1608

FFmpeg实战:5分钟搞定m3u8视频下载与ts文件合并(附完整命令)

本文详细介绍了如何使用FFmpeg快速下载m3u8视频并合并ts文件为mp4格式。通过简洁的命令行操作,读者可以轻松完成视频处理任务,包括环境准备、链接获取、下载合并及性能优化等实用技巧,特别适合需要高效处理流媒体内容的用户。

weixin_30836759的博客 221

基于YOLOv10深度学习的花生种子霉变检测系统

YOLO(You Only Look Once)是当前最先进的目标检测算法之一,具有快速、精准的特性。YOLOv10是YOLO系列的最新版本,相较于之前的版本,YOLOv10在特征提取、模型精度和速度上都有了显著的提升。YOLOv10采用了更深的卷积神经网络、更多的跨层特征融合方法,使得其在不同尺寸物体的检测和复杂场景的处理上都表现出了优异的性能。YOLOv10特别适合应用在需要快速处理并检测大量图像的任务中,如花生种子霉变检测等,能够实现精准、高效的检测。

2201_76125393的博客 648

Java多线程互斥及其区别

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

liu094的博客 849

1、Ka频段双极化低剖面卫通相控阵天线

设计了双馈口叠层十字缝隙耦合天线,采用“双线极化天线 +旋转馈电 + 移相控制”架构,采用双馈口的叠层十字缝隙耦合天线,并以 2 x2 阵列为主体,旋转排布实现二次圆极化,同时极化可切换,通过多层 PCB 工艺实现天线层、控制/电源层功分网终层、芯片层一体化集成,研制出 64 阵元的圆极化可切换发射天线,测试结果表明:天线工作 频段为 27.5 ~31 GHz,可实现60°扫描,法向轴比

qq_43416206的博客 4366

Java线程间的资源互斥共享

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

百彦子烨的博客 5844

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

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

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

Statistics and Machine Learning Toolbox

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

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

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

wiliam_mountain的博客 1463

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

余额充值