多线程的同步代码块或同步函数解决线程安全问题以及对比

【工具】GitHub学生认证+PyCharm配置Copilot全流程指南 本文提供了一份详细的GitHub学生认证及在PyCharm中配置Copilot的完整指南。通过完成A2F认证、准备有效材料并使用干净网络环境,学生可免费获取GitHub Copilot Pro订阅,极大提升编程学习与开发效率。 阅读详情

产生线程安全的原因:

1、多个线程操作共享数据

2、操作共享数据的线程代码有多条

当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算就会导致线程安全的产生。

比如:

当我们每个线程进入判断语句时候我让他睡眠10毫秒,那比如此时num为2的时候,有4个线程在执行,

其中线程1进如判断语句了值为2

其中线程2进如判断语句了值为2

其中线程3进如判断语句了值为2

其中线程4进如判断语句了值为2

当进行票数相减时候其中一个线程执行完毕为1

那另一个线程不是出现了-1,这个时候就出现问题了

public class ThreadExplain implements Runnable{
    private int num = 100;

    public void show(){
        while (true){
            if(num>0){
                try {
                    Thread.sleep(10);//当每个线程运行到这里的时候我让线程睡眠10毫秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"当前票数为"+num--);
            }
        }
    }
    @Override
    public void run() {
        show();
    }
}
public static void main(String[] args){
        ThreadExplain t = new ThreadExplain();
        Thread th1 = new Thread(t);
        Thread th2 = new Thread(t);
        Thread th3 = new Thread(t);
        Thread th4 = new Thread(t);
        th1.start();
        th2.start();
        th3.start();
        th4.start();
    }

 

解决办法:

用同步代码块来解决;

格式:synchronized(对象){

}

同步弊端:效率会有影响

 

public class ThreadExplain implements Runnable{

    private int num = 100;
    Object object = new Object();
    public void show(){
        while (true){
            synchronized (object){
                if(num>0){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"当前票数0"+num--);
                }
            }
        }
    }
    @Override
    public void run() {
        show();
    }
}

除了同步代码块还可以用同步函数,只是开发一般用同步代码块

同步代码块与同步函数的区别,

同步代码块的锁是任意对象,同步函数的锁是this

public class ThreadExplain implements Runnable{

    private int num = 100;
    Object object = new Object();
    public void show(){
        while (true){
            /*synchronized (object){
                if(num>0){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"当前票数0"+num--);
                }
            }*/
            synfunction();
        }
    }
    public synchronized void synfunction(){
        if(num>0){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"当前票数0"+num--);
        }
    }
    @Override
    public void run() {
        show();
    }
}
【数字IC验证进阶】正则表达式(Regular Expression)快速入门指南 在芯片开发过程中,正则表达式的使用非常常见。初次上手晦涩难懂,多用几次爱不释手! 阅读详情

相关推荐

异次元发卡最新漏洞0day(XSS组合拳)

异次元商店头像上传处存在存储型XSS注入(user、admin均存在)。其中,user处有过滤,admin无。 将恶意脚本插入后,管理员访问用户管理页面即可执行恶意脚本。 恶意脚本执行后,会新增一个管理员用户,进而获得权限。鉴于漏洞还没有泛滥,而且很多站都有漏洞。EXP暂时不公开。需要学习可以加入知识星球

白昼小丑的博客 4603

第十八讲 多线程——多线程安全问题的解决方案——同步代码块和同步函数

同步代码块 当多个线程使用同一个共享资源时,可以将处理共享资源的代码放在一个使用synchronized关键字来修饰的代码块中,这个代码块被称作同步代码块,格式如下: synchronized(对象) { 需要被同步的代码 } 对象如同锁,持有锁的线程可以在同步中执行,没有持有锁的线程即使获取CPU的执行权,也进不去,因为没有锁。火车上的卫生间就是一个经典的同步例子,对于简单的卖...

李阿昀的博客 875

从实验室到晶圆厂:一文看懂二维半导体(如MoS2)的CVD生长与晶体管制造挑战

本文深入探讨了二维半导体(如MoS2)从实验室研究到晶圆厂量产的CVD生长与晶体管制造关键技术挑战。重点分析了晶圆级二维半导体的CVD生长工艺优化、晶体管制造的四大界面工程难题,以及掺杂与集成的产业化解决方案,为二维半导体在集成电路领域的应用提供技术参考。

weixin_42651748的博客 474

多线程之间实现同步

为什么有线程安全问题   当多个线程同时共享同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 线程安全问题前提条件:   必须是在多线环境下,多个线程共享一个资源,对资源进行写操作(非原子性操作) 什么是多线程之间同步   当多个线程共享同一个资源,不会受到其他线程的干扰。 需求说明:2个窗口同时卖100...

diding5932的博客 226

RuoYi(分离版) 使用代码生成器添加子模块(idea版)

文章目录准备一、使用代码生成器1.数据库2.导入表并生成代码二、导入代码文件1.新建一个模块2.导入zip代码文件3.模块环境配置添加菜单和访问地址总结 准备 前提要把系统启动起来,部分教程可以参考这边文章若依框架RuoYi前后端分离项目导入IDEA及运行启动 但是完全参考这篇文章还是不能把项目启动起来,因为这篇文章没有说明数据库。 我是用的是本地数据库,采用xampp+Navicat的组合来部署和访问数据库。打开Navicat,连接并创建数据库ry-vue并导入数据脚本ry_20191008.sql,q

dream_coke的博客 1万+

逆变器技术解析:DDSRF双解耦在正负序分离中的关键作用

本文深入解析了DDSRF双解耦技术在逆变器正负序分离中的关键作用。通过建立正反旋转坐标系并利用交叉反馈解耦网络,DDSRF能快速、精准地分离电网电压中的正负序分量,从而显著提升锁相环在电网不平衡条件下的精度与系统稳定性,是现代高性能并网逆变器的核心算法之一。

m3n5b7v8c9x的博客 413

java多线程-线程创建-线程池-java内存模型

多线程:程序、进程、线程; 线程创建方式:①继承Thread类,重写run方法;②实现Runnable接口,重写run方法;③实现Callable接口,重写call方法,使用FutureTask类;④创建线程池 Executor类 和 ThreadPoolExecutor类 ; 线程池:应用最频繁的并发框架,需要并发或者异步执行的都需要线程池;. 线程调度:sleep、join、setDaemon。 线程的生命周期:创建、就绪、运行、阻塞、死亡。 同步与死锁:同步代码块、同步方法synchronized;.

LXMXHJ的博客 648

windows10家庭版输入loadrunner注册码时报“License security violation. Operation isnot allowed”的解决办法

有可能出现2个错误第一个可能是第二个可能是“License security violation. Operation isnot allowed”ok,在此我在百度找了很多方法,大部分的方法都是删除注册表,但我根本就找不到这个注册表,而后又是管理中心找本地用户和组,但我依旧找不到这个玩意,然后可能是windows10家庭版本来就没有这个。再然后又以管理员身份去运行填写,好的,依旧报错,依旧未解决...

qq_30990097的博客 2560

多线程的线程安全与互斥解决方案——同步代码块/同步函数

文章目录一、线程安全与互斥(案例说明)1.经典案例2.代码实现小结二、解决思路1.解决办法——同步代码块2.同步代码块(SellTicket线程)3.解决办法——同步函数2.同步函数(SellTicket线程)总结 一、线程安全与互斥(案例说明) 1.经典案例 1、有100张电影票 2、设置三个窗口同时卖电影票 3、观察卖电影票的过程 2.代码实现 代码如下(SellTicket线程): public class SellTicket implements Runnable { // 定义100张票 p

老赖的小弟的博客 2333

从SRIOV到SIOV:PCIe虚拟化技术下一代革命

如果说SR-IOV是过去十年PCIe虚拟化的“标杆方案”,那SIOV就是为超大规模云数据中心、AI集群量身打造的“破局者”——它解决了SR-IOV难以逾越的扩展性瓶颈,同时平衡了性能、成本与生态兼容性。今天就从“为什么需要SIOV”到“SIOV到底强在哪”,再到“未来要解决什么问题”,做一次全方位深度拆解。

存储随笔 2566

ican项目四汽车零件智能测量

ican项目四汽车零件智能测量

weixin_72050316的博客 562

黑马程序员——java中关于同步函数(或同步代码块)解决多线程安全问题的加锁

------- android培训、java培训、期待与您交流! ---------- 重点:多锁解决安全问题(同步静态函数和非静态函数),懒汉式(单例模式的一种)的加锁问题。     先举例说明说明线程的安全问题。 一、     有一个需求:有四个窗口卖票,用java模拟其卖票过程。 需求分析:必须用四个多线程解决。 代码如下: class Tickets impl

flyingfox023的专栏 880

通过分子模板构建随机分布在溶液中的纳米颗粒(一)

通过分子模板构建随机分布在溶液中的纳米颗粒 要实现的目标: 1、可以循环建立多个水分子溶液的模型; 2、针对不同水分子数,自动创建文件夹; 3、运行完毕将所有结果自动存储在对应文件夹里; 分子模板的具体教程请见我的博客: https://blog.youkuaiyun.com/qq_43689832/article/details/104443175 1、首先,我们先建立纳米颗粒的分子模板,命名为p_30.txt: 包括两种原子类型。具体格式如下: # LAMMPS molecule file makin.

Rockyoung 2651

线程同步:解决线程安全问题

    多线程安全问题,是由于多个线程在访问共享的数据(共享的资源),并且操作共享数据的语句不止一条。那么这样在多条操作共享数据的之间线程就可能发生切换,从而引发线程安全问题。例如如下情况:public class ThreadDemo { public static void main(String[] args){ Apple apple = new Apple(); Th...

雨落成追忆 3577

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

synchronized之使用同步代码块,同步函数以及ReentrantLock解决多线程卖票安全问题

synchronized之同步代码块,同步函数以及ReentrantLock synchronized使用原因 由于在多线程使用时,多个线程同时访问共享资源会出现线程安全问题,对于多线程的操作,为了保证各个线程之间共享资源的安全,synchronize同步代码块就起到了关键性的作用。下面是使用用例以及源代码。 使用synchronized同步代码块解决线程安全问题 public class SellTickes implements Runnable { private int tickes = 100;

weixin_47405768的博客 296

假人有限元模型

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

JAVA中利用 同步代码块 或 同步函数 解决线程的安全问题

线程的安全问题 当一个线程在执行操作共享数据的多条代码的过程中,其它线程参与运算,就会导致线程问题的产生 解决思路: 将多条操作共享数据的线程代码封装起来,当线程在执行这些代码的时候, 其他线程不可以参与运算. 必须要当前把这些代码执行完毕后,其它线程才可以参与运算. 同步代码 同步代码块的格式: synchronized(对象) { ...

weixin_42947972的博客 375

IDEA的使用指南

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

同步代码块应用之取钱问题、线程安全问题之线程同步机制(同步函数)

一、同步代码块经典实例: 1、需求:一个银行账户5000块,两夫妻一个拿着存折,一个拿着卡,开始取钱比赛,每次只能取一千块,要求不准出现线程安全问题。 2、目的:该程序是否有安全问题,如果有,如何解决? 3、如何找问题: 1)明确哪些代码是多线程运行代码。 2)明确共享数据。 3)明确多线程运行代码中哪些语句是操作共享数据的。4、代码解决: 方式一:

一点一滴 649

java线程安全之同步函数和同步代码块

今天在复习java的知识的时候看到了 首先我们得明白两个概念:同步 和 互斥; 同步——这是线程 or  进程之间的 合作关系。对多个线程在执行次序上进行协调,以使并发的各个线程能更好的利共享资源,相互合作。多个线程之间,一个线程需要等待另一个线程执行完毕后才能继续执行。 如:下文中,当一个线程拿到锁没有释放之前另一个线程不能执行,只能是等待上个线程 释放了锁之后才能执行。   互斥—

u013107753的专栏 641

同步代码块解决单例懒汉式线程安全问题

面试复现 面试官:懒汉式和饿汉式有什么不同? 你:饿汉式特点在于有实例的延迟加载 面试官:懒汉式延迟加载有没有什么问题? 你:懒汉式如果多线程访问时有线程安全问题,可以使用同步的方式来解决,同步代码块和同步代码函数都可以,但是同步代码函数稍微有点低效率,用同步代码块的双重判断的形式可以解决这个问题 面试官:加同步的时候使用的锁是哪一个? 你:该类所属的字节码文件对象 面试...

qq_33891573的博客 936

Java中使用同步代码块、同步方法(synchronize关键字)和Lock锁解决线程安全问题

本文介绍了多线程中的线程安全问题和如何通过线程同步的方法来解决线程安全问题。之后介绍了同步代码块、同步方法和Lock锁三种方式来实现线程同步。最后介绍了一些注意事项以及synchronized和Lock的异同。............

m0_71987537的博客 2060

多线程之间如何实现同步?

一、为什么会有线程安全问题? 线程安全问题一般是发生再多线程环境,当多个线程同时共享一个全局变量或静态变量做写的操作时候,可能会发生数据冲突问题,也就是线程安全问题,在读的操作不会发生数据冲突问题 下面看个简单的买票例子 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 代码: public class ThreadTrain1 implements Runnab...

wanghao112956的博客 1万+

线程安全问题出现的原因和解决方法

线程安全问题出现的根本原因: 1. 存在两个或者两个以上的线程共享着一个资源。 2. 操作共享资源的代码有两句或者两句以上。 解决思路: 就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程是不可以参与运算的。 必需要当前线程把这些带那都执行完毕后,其他线程才能参与运算。 同步的好处:解决了线程的安全问题。 同步的弊端:相对降低了效率,因为同步外的线程都会判断同步锁...

qq_32273965的博客 1900

什么是线程安全问题,如何解决?(面经)

线程安全问题在多线程编程中是一个常见且重要的问题。通过合理的同步控制和使用线程安全的类,可以有效地避免线程安全问题,确保程序的正确性和稳定性。在设计多线程程序时,应该充分考虑线程安全问题,并采取相应的措施进行解决。

m0_56653160的博客 1034

Java多线程之间实现同步

一、课程目标 理解线程安全? synchronized用法 死锁 二、什么是线程安全? 2.1 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 代码: class ThreadTrain1 impl...

kai46385076的专栏 1077

同步代码块解决线程安全

案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。 代码: package com.learn; class ThreadDemo01 implements Runnable { // 同时多个窗口共享100 private static int count = 100;// 存放方法区中 private static Object obj = new...

Leon_Jinhai_Sun的博客 225

多线程同步实现原理、同步函数、同步代码块、静态同步函数(关键字synchronized)的详解。

多线程同步实现原理、同步函数、同步代码块、静态同步函数(关键字synchronized)的详解。 在说明同步函数和同步代码快、静态同步函数之前我们先想想: 什么是线程同步? 多线程为什么需要实现同步? 实现同步的原理是什么? 举个栗子:需求现在有100章火车票,有两个窗口同时抢火车票(相当于两个线程),请使用多线程模拟抢票效果。 代码如下:(此段代码非...

AE86-打破常规的博客 573
上一篇: 多线程的创建的两种方式
下一篇: linux基础
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值