多线程基础(三)-多线程并发安全问题

并发安全问题:挑战与解决方案 并发安全问题是软件开发中必须面对的挑战。为了解决这些问题,我们需要了解并发安全问题的类型和原因,并采取适当的措施来解决这些问题。这些措施包括使用锁或其他同步机制、使用原子操作、使用信号量、条件变量等机制、对共享数据进行封装、测试和验证等。随着软件应用的不断发展,并发操作的需求将会不断增加。因此,并发安全问题将会越来越重要。未来,我们需要进一步研究并发安全问题的本质和解决方法,开发更加高效、可靠和可扩展的软件应用。 阅读详情

多线程基础(三)-多线程并发安全问题

当多个线程并发操作同一资源时,由于线程切换实际不可控会导致操作逻辑执行顺序出现混乱,严重时会导致系统瘫痪。例如下面的代码

public class SyncDemo {
    public static void main(String[] args) {
        Table table = new Table();
        Thread t1 = new Thread(){
            public void run(){
                while(true){
                    int bean = table.getMice();
                    Thread.yield();
                    System.out.println(getName()+":"+mice);
                }
            }
        };

        Thread t2 = new Thread(){
            public void run(){
                while(true){
                    int bean = table.getMice();
                    Thread.yield();
                    System.out.println(getName()+":"+mice);
                }
            }
        };

        t1.start();
        t2.start();
    }
}

class Table{
    private int mice = 20;
    public   int getMice(){
        if(mice == 0){
            throw new RuntimeException("没有饭了!");     //①
        }
        /*
         * 当一个线程执行到Thread的静态方法yield后,该线程会主动放弃本次CPU时间片,
         * 回到RUNNABLE状态,等待线程调度再次分配时间片
         * 注:线程没有方法可以主动获取时间片。但可以主动放弃时间片
         */
        Thread.yield();   //暂停当前正在执行的线程对象,并执行其他线程。 
        return mice--;
    }
}

以上代码存在并发安全问题,若mice==0时线程1进行到①时CPU时间用尽,那么线程2也将进入if语句,最后进行mice–。最终线程1也将进行mice–,会导致mice变为负数,程序也进入了死循环。
此处,使用 synchronized 来解决多线程安全问题。
以上代码可以改为:

public   synchronized int getMice(){
        if(mice == 0){
            throw new RuntimeException("没有饭了!");     
        }
        Thread.yield();   
        return mice--;
    }

当一个方法被synchronized修饰后,该方法变成同步方法。
即:多个线程无法同时在该方法内部运行。
将并发操作改为同步操作可以解决并发安全问题。
在方法上使用synchronized,那么同步监视器对象就是当前方法所属对象。即:方法中看到的this


有效的缩小同步范围可以在保证并发安全的前提下尽可能的提高并发效率

同步块可以更准确的控制需要同步运行的代码片段

语法:
 synchronized(同步监视器对象){
        需要同步运行的代码片段
 }

使用同步块时需要注意,必须保证多个线程看到的同步监视器对象是[同一个]时,这些线程运行里面的代码才是同步的。静态方法若使用synchronized修饰后,那么该方法一定具有同步效果。静态方法所使用的同步监视器对象为其方法所属类的类对象。
互斥锁
当synchronized修饰多段代码,但是它们的同步监视器对象是同一个时,这些代码之间就是互斥的。 即:多个线程不能同时运行这些方法

基础多线程高并发问题的解决方案 在学习多线程的时候,会知道在java的实际开发中经常出现高并发的问题,也就是同一资源或者说网站被多线程或者说多用户同时访问导致的线程不安全,易引起网站挂掉的情况称之为高并发。 在基础学习中,我们简单的从多线程的角度去了解最基础的并发解决方案。 还是以多窗口卖票为例 一个Thread的子类完成卖票方法。 这里在测试类中可以开启多个线程来访问同一个成员变量t,会导致卖票数量不精确种种情况。 用第一个解决方案: 同步代码块synchronized(){} 其中()内的参数必须是唯一性。字节码对象也可以,一个是字符 阅读详情

相关推荐

Java之多线程并发环境下的数据安全问题

一 什么是多线程环境下的数据安全问题 多线程环境下的数据安全问题需要满足三个条件 多线程并发 多个线程有共享数据 被共享的数据有修改的行为 二 多线程环境下数据安全的重要性 以后在实际的开发中,我们的项目都是运行在服务器上,而服务器已经将线程的定义、线程对象的创建、线程的启动等都已经实现完了。这些代码我们不需要编写。 最重要的是我们需要知道,我们编写的程序要放到一个多线程的环境下运行,...

gaohanjie123的博客 1226

解决并发请求的幂等操作解决方案

解决幂等操作有很多种,本篇博客着重详细讲解简易版本的解决方案。

Android_la的博客 1188

nmap、X-Scan漏洞扫描和Metasploit中用永恒之蓝漏洞入侵靶机并上传冰河

利用nmap、X-Scan扫描靶机的漏洞,在Metasploit中用扫描出的永恒之蓝漏洞入侵靶机,建立连接后上传冰河木马控制靶机,最后用冰河陷阱清除靶机的冰河木马,记一次完整的入侵控制实验。

m0_59302403的博客 4407

解决RedisTemplate 使用 setIfAbsent 做分布式锁出现返回值为 null 的问题

分布式事务问题

weixin_44874132的博客 2741

保姆级教程:用NFS把群晖NAS的文件夹挂到Ubuntu 22.04上,实现文件无缝共享

本文提供了一份详细的教程,指导用户如何通过NFS协议将群晖NAS的文件夹挂载到Ubuntu 22.04系统上,实现文件的无缝共享。文章对比了NFS与SMB协议的性能差异,并提供了群晖端和Ubuntu端的配置指南、高级参数优化、自动挂载方案以及生产环境中的实战技巧,帮助用户提升文件共享效率和系统稳定性。

weixin_29213827的博客 405

SPICE模型入门到精通

文章目录前言一、SPICE是什么?二、1. 前言 由于笔者的毕业设计与功率半导体器件建模相关,需要用到SPICE软件来建模,在这记录一下从零开始的SPICE学习历程~ 一、SPICE是什么? 电子产品的设计一般先从功能框图开始,然后细化到原理图,还要经过很调试验证过程,最终才能完成。调试和验证的过程复杂而繁琐,在设计集成电路时更是如此,在制造之前急需验证集成电路的功能。 根据电路理论,人们可以建立起节点方程和回路方程,通过解这些方程组成的方程组就可以得到结果,也就是说可以通过计算来获得电路的工作情况。但

qq_42031914的博客 7万+

线程并发安全问题解决方案

并发安全是多个线程对共享资源进行访问操作,共享数据能被正确处理,那么如何保证线程的并发安全呢?

婆婆小屋 1041

Raspberry Pi Pico SDK开发-Timer-定时

RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的片外闪存。 广泛的灵活 I/O 选项包括 I2C、SPI 和独特的可编程 I/O (PIO)。 本实例将演示如何使用Timer的定时功能。

视觉与物联智能 2040

Java线程安全——关于多线程并发环境下,数据的安全问题

Java线程安全——关于多线程并发环境下,数据的安全问题 数据在多线程并发的情况下存在安全问题有三个条件: - 条件一:多线程并发 - 条件二:有共享数据 - 条件三:共享数据有修改的行为 线程同步机制的语法:synchronized (){ 线程同步代码块 } synchronized的三种写法:第一种:同步代码块. 第二种:在实例方法上使用synchronized。 第三种:在静态方法上使用synchronized。

Best_Basic的博客 2627

【AutoSAR】【WdgM】WdgM安全管理模块

一、WdgM在AutoSAR里的整体架构 WdgM是在autosar架构里位于服务层的一个基础软件模块;主要监督程序的执行; 主要包括三个模块: 看门狗管理器(WdgM) 看门狗接口(WdgIf) 看门狗驱动(Wdg) 二、三种监督机制 Alive监控-------主要监控周期性软件程序的时间 DeadLine监控-------主要监控非周期软件程序 程序流监控-------主要监控程序流执行的正确性 三、基于全局状态的检测流程 受监管实体(SE):Supervised Ent

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 2992

第42篇FEDGLOSS算法BEYOND LOCAL SHARPNESS:COMMUNICATION-EFFICIENT GLOBALSHARPNESS-AWARE MINIMIZATIONFOR

:用上一轮伪梯度最小化锐度,获取与全局损失最相关的几何信息,引导全局优化趋向更平坦的最小值。效果对比分析:FEDGLOss。

weixin_74009895的博客 526

Redisson(一):分布式下高并发的问题

Redis分布式锁实现高并发情境下出现的问题锁续命 Redis分布式锁 为什么要用到分布式锁呢? 对于单机项目来说,不需要使用到分布式锁,只要使用自己JVM的锁就够用了,但是当项目搭上了集群之后,同个项目是有几个实例去对外提供服务的,那么就需要使用分布式锁,本质来说分布式锁就是让不同实例之前可以使用同一把锁 实现 Redis作分布式锁,本质上就是使用了一条set命令 setnx key value 这个命令的作用是 假如key不存在,就如一般的set key value命令一样,只是往数据库添加键值对.

GDUT_Trim的博客 1828

实战篇| app爬虫不用真机

之前写过一篇基于真机app爬虫《App爬虫实战篇-以华为真机手机爬取集换社的app为例》,如果大家有用真机爬虫的经历,会深刻认识到真的不方便,一是自己的手机,经常会被电话、微信等打断,二是闲置手机,面对小批量数据还能勉强,大批量爬虫,会导致成本指数级上升,并且控制起来相对麻烦。以下就是常见的模拟器。emulator -avd my_avd -no-snapshot-save # 启动时不保存 snapshot。emulator -avd my_avd -wipe-data # 清除数据(恢复到出厂)

youbingchen的博客 597

Java 并发编程基础概念与常见问题梳理

进程:资源分配的基本单位,相互独立,开销大;线程:执行的基本单位,共享进程资源,开销小;一个进程可以包含多个线程,线程不能独立存在,必须依赖于进程。并发:交替执行,模拟同时,单核即可实现;并行:同时执行,真正同时,必须依赖多核;Java 并发编程的目标:在单核环境下实现高效并发,在多核环境下充分利用并行优势。Java 并发编程在现代软件开发中有着举足轻重的地位——它能充分利用硬件资源,提升系统性能和响应性,解决复杂业务场景下的并发需求,但同时也伴随着线程安全、死锁、活跃度等诸多挑战。

2501_90914799的博客 463

SAP-ABAP:SAP Open SQL 分页技术深度解析:语法、性能陷阱与最佳实践

SAP Open SQL 分页技术深度解析:语法、性能陷阱与最佳实践

baidu_35680696的博客 634

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

多线程并发安全问题详解

定义: 当多个线程同时执行,多个线程之间是相互抢占资源执行,并且抢占是发生在线程的执行的每一步过程中,导致出现非法数据。这种现象就称之为多线程的并发安全问题。 代码案例: public class SellTicketDemo { public static void main(String[] args) { //创建票对象 Ticket t=new Ticke...

帅成一匹马 4654

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

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

JAVA中的多线程并发运行安全问题

JAVA中的多线程并发运行安全问题 1.什么是多线程并发运行安全问题? 当多个线程并发操作一个数据时,由于线程操作的时间不可控的原因,可能会导致操作该数据时的过程没有按照程序设计的执行顺序运行,导致操作后数据出现混乱,严重时可导致系统瘫痪。 2.用synchronized修饰的方法 当一个方法用synchronized修饰,那么该方法变为“同步方法“多个线程不能同时进入方法内容运行的,必须时有顺序的一个一个运行,这样就能避免并发安全问题。 案例:抢豆豆事件(使豆豆的剩余量不能为负数) public clas

weixin_47600732的博客 4874

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

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java多线程并发安全问题

当多个线程并发操作同一临界资源,由于线程切换时机不确定,导致操作临界资源的顺序出现混乱严重时可能导致系统瘫痪.临界资源:操作该资源的全过程同时只能被单个线程完成.

是程序喵呀 1201

Java并发——如何处理多线程并发安全的问题

大家好,我是chowley,今天在复习Java并发的内容,顺便来回答一个经典问题——如何处理多线程并发安全?并发编程涉及到多线程同时访问共享资源的问题,而多线程并发访问共享资源可能导致数据不一致、竞态条件等问题,因此如何处理多线程并发安全成为了 Java 开发中的重点。在 Java 并发编程中,处理多线程并发安全的问题是非常重要的。通过合理地选择同步机制、原子操作、并发容器等技术手段,可以有效地保证多线程环境下的数据一致性和程序的正确性。根据具体的需求和场景选择合适的并发控制手段,确保程序的稳定性和可靠性。

chowley的博客 1197

多线程并发安全系列问题(三)

AtomicInteger的ABA问题是“值相同但中间被改过”导致的误判;解决办法是给值加版本号,同时校验值和版本号;AtomicStampedReference就是通过“值+版本号”的组合,确保CAS操作能识别中间的修改,从根本上避免ABA问题。简单说:AtomicInteger像“只认数字的门卫”,AtomicStampedReference像“既认数字又认通行证(版本号)的门卫”,后者更严格,能防止“换了身份又回来”的情况。

weixin_43521001的博客 968

关于多线程并发环境下的安全问题

关于多线程并发环境下的安全问题: 这个是重点: 以后在开发中,我们的项目都是运行在服务器当中,而服务器已经将线程的定义,线程对象的创建,线程的启动等,都已经实现了,这些代码我们都不需要编写。 最重要的是:你编写的程序需要放到一个多线程的环境下运行,你更需要关注这些数据在多线程并发执行的情况下是否安全。 什么时候数据在并发的环境下会存在安全问题? 三个条件: 条件一:多线程并发。 条件二:有共享数据。 条件三:多个线程修改共享数据。 怎么解决线程并发的安全问题? 线程排队执行。(不能并发) 这种机制被称为:线

pipizhen_的博客 1007

synchronized关键字解决多线程并发安全问题

线程:单一的顺序执行流程就是一个线程,顺序执行:代码一句一句的先后执行。多线程:多个线程并发执行。线程之间的代码是快速被CPU切换执行的,造成一种感官上"同时"执行的效果。

weixin_52007132的博客 1375

多线程并发安全问题

文章预览:使用多线程实现多客户端连接服务端线程API获取线程相关信息的方法线程优先级sleep阻塞线程APIsleep阻塞(续)守护线程多线程并发安全问题synchronized关键字synchronized有两种使用方式同步方法同步块同步监视器对象即上锁的对象,要想保证同步块中的代码被多个线程同步运行,则要求多个线程看到的同步监视器对象是同一个.在静态方法上使用synchronized静态方法中使用同步块时,指定的锁对象通常也是当前类的类对象互斥锁死锁 使用多线程实现多客户端连接服务端 流程图 [外链图片

Bromide 704

多线程并发的安全问题

多线程并发的安全问题 当多个线程并发操作同一个临界资源时,由于线程切换的时机不确定,导致操作顺序发生混乱情况,严重时可能导致系统瘫痪。 解决方法有一下几种:同步锁,同步块,互斥锁等。 1、同步锁(synchronized)加到被多个线程使用的方法上 当一个方法使用关键字synchronized修饰后, * 这个方法称为:同步方法 * 同步方法要求多个线程不能同时进入到方法内部 * 必须“排队”运行...

weixin_45350768的博客 807

【单机和分布式环境下的多线程并发访问的安全性问题】

【多线程并发访问的安全性问题】 多线程并发访问的安全性问题 首先要知道的是:多线程安全性问题产生的原因是什么? 多线程并发访问是指当多个线程无序的访问同一个共享资源时,这个线程就受到了“多个线程的并发访问”。 多线程并发访问的安全问题 在出现多个线程并发访问的时候,这时就有可能产生并发访问的安全性问题,可能.........

qq_42384113的博客 9662

JAVA多线程·并发问题及解决思路

一、概述 1. 线程 线程允许在同一个进程中存在多个程序控制流。线程可以共享进程的资源,但是每个线程都有自己的程序计数器、栈和局部变量表。同一进程中的不同线程能够访问相同的变量,并且在同一个堆上分配对象。 2. 多线程 多线程的优势/作用 提高程序的运行性能。 充分利用系统的处理能力,提高系统的资源利用率。 提高系统响应性,即线程可以在运行现有任务的情况下立即开始处理新的任务。 多线程通信 多线程之间需要进行通信,线程的通信依赖共享内存和线程方法的调用来实现。Java内存模型分为主内存和工作

小九的专栏 2302
上一篇: 多线程基础(二)
下一篇: Map 查找表 基础知识(一)
halfgap
博客等级 码龄9年 0粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值