线程同步代码块

news2025/7/16 4:36:20

同步代码块

作用:把访问共享资源的核心代码给上锁  ,以此保证线程安全

原理:每次只有允许一个线程加锁以后进入。执行完毕以后自动解锁 。     

   其他线才可以进来执行。同步代码的注意事项

对于当前同时执行的线程来说 ,同步锁必须是同一把 (同一个对象)否自会出bug

同步代码块上锁的方法

1、是同步代码块好还是同步方法好一点?
范围上:同步代码块锁的范围更小,同步方法锁的范围更大

同步代码块的性能好因为范围小 

还有一种直接写到修饰符后面

注意
Lock锁是IDK5开始提供的一个新的锁定操作,通过它可以创建出锁对象进行加锁和解锁,更灵活、更方便、更强大

Lock是接口,不能直接实例化,可以采用它的实现类ReentrantLock来构建Lock锁对象。

创建Lock对象  

调用Iock对象 加锁

解锁如果出现bug程序卡在质量

package SafetyTest;

import java.time.LocalDateTime;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Account {
    private String carId;  //卡号
    private double money ;//余额
   private final Lock lk= new ReentrantLock();

    public Account() {
    }

    public Account(String carId, double money) {
        this.carId = carId;
        this.money = money;

    }
    public  void drawMoney(double mony) {
        lk.lock();
        //先知道那个人来取钱
      String name= Thread.currentThread().getName();
            if (this.money>=mony){
                System.out.println(name+"来取钱"+mony+"成功!");
                this.money-=mony;
                System.out.println(name+"来取钱后:剩余的“:"+this.money);
            }else{
                System.out.println(name+"来取钱:余额不足~~!");
            }
            lk.unlock();
    }

    public String getCarId() {
        return carId;
    }

    public void setCarId(String carId) {
        this.carId = carId;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }


}

package SafetyTest;

public class DrawThread extends Thread {

private Account acc;
public DrawThread(Account acc, String name){
    super(name);
    this.acc=acc;
}

    @Override
    public void run() {
        super.run();
        //取钱
        acc.drawMoney(10000);
    }
}
package SafetyTest;


public class ThreadSafety {
    //模拟线程安全问题
    public static void main(String[] args) {
        //1:创建一个账户对象 代表两个人的共享账户
        Account acc=new Account("ICBC",10000);
        //创建两个线程 分别两个人 再去同一个账户里取钱10000

        Account acc1=new Account("ICBC",10000);
        new DrawThread(acc1,"第一个人1").start(); //第1个人
        new DrawThread(acc1,"第二个人2")  .start(); //第2个人





        new DrawThread(acc,"第一个人").start(); //第1个人
        new DrawThread(acc,"第二个人").start(); //第2个人

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1102784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue Router - 路由的使用、两种切换方式、两种传参方式、嵌套方式

目录 一、Vue Router 1.1、下载 1.2、基本使用 a)引入 vue-router.js(注意:要在 Vue.js 之后引入). b)创建好路由规则 c)注册到 Vue 实例中 d)展示路由组件 1.3、切换路由的两种方式 1.…

【Java 进阶篇】JavaScript BOM(浏览器对象模型)详解

BOM,即浏览器对象模型(Browser Object Model),是JavaScript与浏览器之间的接口,它允许JavaScript与浏览器进行交互,实现访问和控制浏览器窗口、文档和其他浏览器功能的功能。本文将详细介绍BOM的各个方面&a…

做web自动化测试遇到Chrome浏览器老是自动更新,怎么办 ? 这里提供两个解决办法 。

web自动化安装驱动安装 进行web自动化时 ,需要提前安装浏览器的驱动 ,尤其是chrome浏览器 。它的更新速度很快 ,是不是更新了新版本 。这就导致我们的驱动也要跟着变化。 1.停止自动更新 那么 ,如何关闭chrome浏览器的自动更新…

对称(镜像)二叉树

之前写的比较两棵树是否相等,是左子树和左子树比,右子树和右子树比——利用这个思想镜像二叉树就是从第二层的两个节点作为两棵树的根,然后比较,这里的比较是左子树和右子树比,右子树和左子树比 ——也就是利用比较两个…

CS鱼饵制作

文章目录 宏病毒(宏钓鱼)快捷方式钓鱼shellQMaker bug伪装pdf文件上线 宏病毒(宏钓鱼) 启动teamsever服务器,具体过程请参考我之前的文章: 在主机中启动CS客户端,111是真实机的用户&#xff1a…

电压参考芯片 LM285D-1.2 备忘

LM285D-1.2 是一款参考电压芯片,本次备忘使用的数据手册是安美森家的。 LM285D 中的 D 指的是 SOIC-8 封装,是贴片的; 而 LM285Z 中的 Z 指的是 TO-92 封装,是直插的。购买时需要注意,防止买错封装。 注:以下参数中&…

Vue之Vue的介绍安装开发实例生命周期钩子

博主心得: keyup必须与change一起使用v-on.click可以直接写成clickclick“setVal”里的setVal换成数字之后有惊喜VS Code是真的狗,一些报错根本不会直接显示总结:VS code太狗了 1.vue介绍 1.1 什么是vue vue是一个构建用户界面UI的渐进式jav…

LLM-RAG-WEB 大模型+文件+可视化界面

注意:这里只是简单实现了功能和界面,文件对话也暂时只支持一个文件,如果跳到模型对话再切换回文件对话会文件会删除重置会话,但模型对话切换回来时保留之前会话的。 1、代码(使用步骤说明在链接里) 参考下…

transformer_01

一、传统RNN存在的问题 1.序列前序太长,每个xi要记住前面的特征,而且一直在学,没有忘记,可能特征不能学的太好 2.串行,层越多越慢,难以堆叠很多层; 3.只能看到过去,不能看到未来 搞…

二维码智慧门牌管理系统:高效标准化处理地址数据

文章目录 前言一、标准化数据的重要性二、标准检查与自动化处理三、人工修复与高效性四、数据应用与效益 前言 随着科技的快速发展,数据管理在现代社会中扮演着越来越重要的角色。为了提升数据质量,标准化检查成为必不可少的环节。今天,我们…

Cobalt Strike

文章目录 Cobalt Strike1. Cobalt Strike 简介2. Cobalt Strike 和 MSF 的区别3. Cobalt Strike server4. Cobalt Strike client4.1 安装插件4.2 运行木马4.3 参数详情 5. Cobalt Strike 鱼饵制作5.1 宏5.2 Power shell5.3 快捷方式5.4 ShellQMaker 免杀5.5 伪装pdf文件 Cobalt…

基于龙格-库塔优化的BP神经网络(分类应用) - 附代码

基于龙格-库塔优化的BP神经网络(分类应用) - 附代码 文章目录 基于龙格-库塔优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.龙格-库塔优化BP神经网络3.1 BP神经网络参数设置3.2 龙格-库塔算法应用 4.测试…

【JVM系列】- 类加载子系统与加载过程

类加载子系统与加载过程 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习心得,欢迎指正…

【Linux】文件IO基础知识——上篇

目录 前文 一, 系统级——文件操作接口 a. open b. close c. write d. read 二,接口理解 那文件描述符——fd是什么呢? 三,文件描述符分配规则 原理 四,重定向——dup2 简易shell——重定向 五&#xff0c…

laravel中锁以及事务的简单使用

一、首先来说一下什么是共享锁?什么是排他锁? 共享:我可以读 写 加锁 , 别人可以 读 加锁。 排他:只有我 才 可以 读 写 加锁 , 也就是说,必须要等我提交事务,其他的才可以操作。 二、简单例子实现加锁 锁…

基于C8051F380的流水灯设计

一、C8051F380简介: C8051F380-GQ 是Silicon Labs的一款高度集成的汽车和工业微控制器 MCU。C8051F380的CPU内核为8051,内核规格: 8 位 , 速度: 48 MIPS ; CPU最大主频:192MHz ;工作电压范围:2.7V~5.25V &a…

用shell批量修改文件名

场景一 给这些文件都加上.png后缀 #!/bin/bash for i in *; do mv "$i" "$i.png"; done 场景二 给某些文件按某种规则重命名,如按照1,2,3,4…命名,保留原格式 注: Shell中实现整数自增的几种方法示例,此处用于声明是数字类型的declare -i必须添加,否则…

MyBatisPlue-03

一 映射匹配兼容机制 1.映射数据库的字段名 问题描述: 当数据库表字段和实体类的属性名称出现不匹配时: 解决: 知识点: 2.忽略实体类的部分字段 问题描述: 当要表示如 显示用户是否在线等消息,&#xf…

物联网AI MicroPython传感器学习 之 ADXL345 3轴加速度传感器

学物联网,来万物简单IoT物联网!! 一、产品简介 ADXL345是一款完整的3轴加速度测量系统,可选择的测量范围有士2g,士4g,士8g或士16g。它既能测量运动或冲击导致的动态加速度,也能测量静止加速度&…