---synchronized 关键字---

在多线程编程中,由于代码的并发执行,导致了不同的线程在修改相同的变量会导致变量的值错误

比如 变量 c = 2,这里有线程A 和 B一起使用 c变量并对他加1,这时就会有多中情况

这里要注意的是变量c是储存在内存中的,而线程要使用变量就需要吧变量读取都寄存器中,在对他进行操作

1   A B 同时得到了c 那么,c在A中的值为2,c在B中的值也为2,那么对他进行加一,那么最终结果c的值就是3 这就产生内存可见性的问题

内存可见性:当多个线程同时对一个变量进行修改时,线程不会再第一时间获取到变量对象的数据,就会导致一些不可预测的错误

比如我要对变量 a 通过俩个线程一起对他进行10000次的加一操作

发现最终的结果不是20000,这就是内存可见性引起的错误,且这个值是随机的

2  A 先得到了c 并对他进行了修改,B再得到了A修改后得c再对他进行操作,这样c得值就是4

而这样程序就充满得不确定性,为了避免这个问题,所以我们使用synchronized关键字来给线程上锁

synchronized使用

synchronized(锁对象){

//具体的逻辑实现

}

互斥访问

对于加了synchronized的代码块会在一个线程获得锁后执行对应的逻辑,在逻辑执行完后解锁,这时起他的线程才能获取锁,否者线程就会进入阻塞等待过程中,这样就能解决内存可见性的问题

可重入锁

java中实现了可重入锁,也就是对于相同锁对象的锁可以重复进入,不需要等他解锁

比如这样还是能正常运行,最有效的锁就只有最外层的锁,实现的方式通过一个count变量,从第一个synchronized开始遇到一个{ 就加加遇到 } 就减减最终中但count==0是就是解锁的时候

死锁

在一个锁a中尝试获取锁b,再另一个线程锁b又去获取a这样形成了个循环就会出现死锁的情况

对于死锁的解决方法可以规定每把锁的索取顺序,必须要等锁1 获取了才能锁2,否者就进入阻塞等待的情况,这样就能很好的避免死锁

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【git】 git 删除了文件,如何找回

git 删除了文件,如何找回 使用 git revert 并不是恢复误删除文件的最佳方法,因为 git revert 通常用于撤销已经提交的更改(生成一个反向提交)。如果你误删除了文件,还未提交更改,或者已经提交但想恢复删除…

2024年9月电子学会青少年软件编程Python等级考试(三级)真题试卷

2024年9月青少年软件编程Python等级考试(三级)真题试卷 选择题 第 1 题 单选题 以下python表达式的值为True的是?( ) A.all( ,1,2,3) B.any([]) C.bool(abc) D.divmod(6,0) 第 2 题 单选题 下列python代码的…

钉钉与金蝶云星空数据集成:提高企业付款申请单处理效率

钉钉数据集成到金蝶云星空:付款申请单的自动下推生成 在企业日常运营中,如何高效地管理和处理付款申请单是一个关键问题。为了提升这一流程的效率,我们采用了轻易云数据集成平台,将钉钉中的付款申请单数据无缝对接到金蝶云星空系…

Spring Boot助力的厨艺互动平台开发指南

2 相关技术 2.1 Spring Boot框架简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Sprin…

代码学习:如何阅读开源代码

如何阅读开源代码 准备 目的:学习代码,代码添加新功能、旧代码重构知识准备:技术基础、编程基础、文档开发环境:依赖环境及操作系统笔记:添加代码注释及重要思路记录文档 实操 阅读项目Readme.md:大致了…

基于边缘计算的智能门禁系统架构设计分析

案例 阅读以下关于 Web 系统架构设计的叙述,回答问题1至问题3。 【说明】 某公司拟开发一套基于边缘计算的智能门禁系统,用于如园区、新零售、工业现场等存在来访被访业务的场景。来访者在来访前,可以通过线上提前预约的方式将自己的个人信息…

软考:CORBA架构

CORBA过时了吗 CORBA指南 个人小结: IPC,进程间通信,Socket应用在不同机器之间的通信 RPC是一种技术思想而非一种规范 但站在八九十年代的当口,简单来说,就是我在本地调用了一个函数,或者对象的方法&…

沧穹科技室内音频“北斗”定位技术亮相第三届北斗规模应用国际峰会

10月24日-28日,由国家发展改革委、国家网信办、交通运输部、湖南省人民政府共同主办的第三届北斗规模应用国际峰会于株洲国际会展中心隆重开幕。沧穹科技总经理戴坚先生受邀出席开幕式,公司自研室内音频“北斗”定位产品亮相北斗规模应用示范场景区。 峰…

NSSCTF刷题篇web部分

源码泄露 [FSCTF 2023]寻找蛛丝马迹 这个源码泄露,可以记录一下,涉及的知识点比较多 打开环境 查看源码, 第一段flag 乱码,恢复一下 乱码恢复网站:乱码恢复 (mytju.com) 剩下的就只说方法 http://node4.anna.nss…

Pytest-Bdd-Playwright 系列教程(2):支持在多浏览器、多环境中执行测试

Pytest-Bdd-Playwright 系列教程(2):支持在多浏览器、多环境中执行测试 前言一、 修改 conftest.py 文件二、创建配置文件三、修改search_steps.py文件四、运行测试总结 前言 本文教程知识点: 支持在多浏览器、多环境中执行测试 …

【ROS概述】C++运行hello world

Python和C通用步骤: 一、创建工作空间并初始化 1、新建工作空间(work space)——使用终端(ctrlaltT) mkdir -p 空间名称/src 2、进入工作空间 cd 空间名称 可以在文件里看到同步变化,并且demo01_ws文…

SpringBoot项目上高并发问题的解决方案

案例:多个用户同时购买数量为1的商品,所以只能有一个购买成功 不加锁 会重复购买 乐观锁,加字段处理,在并发少的时候可以使用 加版本号字段,第一次查询数量的时候读取到版本号,更新数量时用同样的版本号更新…

前端经典【面试题】持续更新HTML、CSS、JS、VUE、FLUTTER、性能优化等

HTML/CSS 面试题 什么是语义化 HTML&#xff1f; 说明&#xff1a;语义化 HTML 使用 HTML 标签来描述内容的含义&#xff0c;而不仅仅是其外观。使用语义化标签可以提高可读性和可访问性&#xff0c;并对 SEO 友好。示例&#xff1a; <header><h1>网站标题</h1&…

服务器数据恢复—异常断电导致服务器挂载分区无法访问的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌服务器同品牌存储&#xff0c;Linux centos7EXT4文件系统。 服务器故障&#xff1a; 意外断电导致服务器操作系统不能正常启动。经过修复后系统可以正常启动&#xff0c;但是挂载的分区无法正常访问。使用fsck修复这个问题分区&#xff…

gin入门教程(7): 使用 Logrus + Lumberjack 创建日志中间件

结合 Logrus 和 Lumberjack&#xff0c;可以创建一个高效的日志中间件&#xff0c;用于记录请求和响应。以下是实现步骤&#xff1a; 1. 安装依赖 首先&#xff0c;确保安装了 Logrus 和 Lumberjack&#xff1a; go get github.com/sirupsen/logrus go get gopkg.in/natefin…

汉明距离汉明重量

目录 汉明距离汉明重量检错&纠错应用场景例题 汉明距离 在信息论中&#xff0c;两个等长字符串之间的汉明距离&#xff08;英语&#xff1a;Hamming distance&#xff09;是两个字符串对应位置的不同字符的个数。换句话说&#xff0c;它是将一个字符串变换成另外一个字符串…

v4.7版本使用线下付款方式不给管理员发送新订单通知问题修复

在app/api/controller/v1/order/StoreOrderController.php文件中&#xff0c;将红框内的代码注释&#xff0c;加上绿框的代码即可修复 if ($this->services->setOrderTypePayOffline($order[order_id])) {event(NoticeListener, [$order, admin_pay_success_code]);retur…

行为设计模式 -命令模式- JAVA

命令模式 一.简介二. 案例2.1 接收者&#xff08;Receiver&#xff09;2.2 命令接口实现对象&#xff08;ConcreteCommand&#xff09;2.3 调用者&#xff08; invoker&#xff09;2.4 获取Receiver对象2. 5 装配者客户端测试 三. 结论3.1 要点3.2 示例 前言 本设计模式专栏写了…

MySQL 数据库备份与恢复全攻略

MySQL 数据库备份与恢复全攻略 引言 在现代应用中&#xff0c;数据库是核心组件之一。无论是个人项目还是企业级应用&#xff0c;数据的安全性和完整性都至关重要。为了防止数据丢失、损坏或意外删除&#xff0c;定期备份数据库是必不可少的。本文将详细介绍 MySQL 数据库的备…

SQL Server 中,将单行数据转换为多行数据

在 SQL Server 中&#xff0c;将单行数据转换为多行数据通常涉及到将某个字段中的逗号分隔的值拆分成多行。这种操作通常称为“拆分”或“展开”&#xff08;Explode&#xff09;。以下是一些常用的方法来实现这一目标&#xff1a; 1. 使用内置函数 STRING_SPLIT 从 SQL Serv…