浅谈线程安全与sychronized

Windows 11 24H2 外接显卡坞兼容性实测:3步解决USB设备失效 本文详细解析了Windows 11 24H2系统下外接显卡坞导致USB设备失效的问题,并提供了三步终极解决方案:驱动预解压与手动更新、电源管理设置调整、优化的设备连接顺序。通过雷电3接口的兼容性优化,帮助用户解决键盘鼠标卡死等常见问题,提升外接显卡坞的稳定性与性能。 阅读详情

使用多线程处理相关业务,在一定程度上能够获得更高的执行效率,提高程序性能,但是,如果我们在写多线程程序时,不加强注意,容易出现数据不一致性,也就是我们常说的 "线程安全" 问题。线程安全是我们在设计多线程程序时必须保证的一点,如果我们写出的程序数据正确性不能得到保证,即使程序性能得到提高,也是毫无意义的。

非线程安全在什么时候会出现呢?

当多个线程对同一对象实例进行并发访问时,可能得到错误的结果,这就是线程不安全的。相反,无论多少线程对同一对象实例进行并发访问,都能得到一致的结果,这就是线程安全的。

下面我们给出一个经典的线程不安全的例子:

我们在当前程序中定义来了一个instance对象,对它执行++操作,按照正常逻辑,它返回的结果应该是200,然而结果总是差强人意。这里,我们可以看到返回的结果是144,大家可以多执行几次,看看有什么不同,由于instance++不是原子性操作,因此,我们的程序存在安全性问题。那么怎样才能使结果变为200呢?我们做一点小的修改:

大家可以发现,结果是我们预期值200了。这里我们在instance++操作上加了一段synchronized语句块,好神奇,它为什么就能解决线程安全性问题呢。

sychronized关键字,实现线程间的同步,它的作用就是给同步代码加锁,每一次只能有一个线程进入同步块,从而保证线程安全性问题。在上一段代码中,当线程A在对instance变量进行读写的时候,线程B只能等待线程A执行完成,才能对instance变量进行++操作。

sychronized大致有三种用法,这里详细讲解一下:

1.指定对象加锁。当线程访问同步块时,首先获取加锁对象,如果对象锁被其它线程持有,则进行等待。

2.作用于实例方法上。给当前实例加锁,访问同步代码时,首先获得当前实例的锁。

3.作用于静态方法上。静态方法加锁,给当前class加锁,访问同步代码时,需要获得当前类的锁。

大家现在应该立马就能想到,上述代码,我们使用的就是第一种方式,给指定对象加锁。我们加锁的对象就是当前类的实例对象,当我们对同一实例对象进行访问时,一次只有一个线程获得对象锁。关于另外两种加锁方式,我们修改一下上述代码来理解它们:

实例对象加锁:

结果符合预期,我们把之前的同步块改成了实例方法,该方法,锁住的是SychronizedDemo的实例对象,和之前同步块中this的效果一样。当线程需要访问同步方法时,必须先获得当前类的实例对象,否则,只能进行等待。

静态方法加锁:

结果符合预期,大家可以看到,main()方法中,我们new 了两个实例对象,但是结果竟然是正确的。因为我们使用的是静态方法加锁,这样锁住的就是当前类对象,无论我们定义多少个实例对象,结果都是一样的。

sychronized的另外一个特性:锁重入。在使用sychronized关键字时,当一个线程获得对象锁后,再次请求此对象锁时是可以再次获得该对象锁的。简单来说就是,在一个sychronized方法或同步块中调用当前类的其它sychronized方法,是能够得到锁的。大家可以想一下,当前线程在还未释放锁时,再一次请求锁,如果不可锁重入的话,就会形成死锁,这是大家最不想看到的。关于锁重入,大家可以写三个sychronized修饰的方法,然后相互调用,看看是否可以正常执行。限于篇幅,这里我就不贴出代码了。

sychronized关键字,大家是不是觉得它在解决线程安全时,特别的简单,无需太多的操作。大家再思考一下,如果我们现在有两个方法,第一个方法执行写操作,第二个方法执行读操作,当我们使用sychronized关键字修饰时,那么我们多个线程同时执行读方法,也会相互等待,这是我们不愿意看到的。我们只希望读写互斥,写写互斥,读读不互斥,那么我们就需要了解另外一个重入锁Lock了,下一节,我们关于Lock的用法进行详细讲解。

 

 

Workbench-nCode下发动机引擎应力疲劳分析 在工程数据库中定义材料模型参数,结构场分析基本参数:密度7850Kg/m3、弹性模量210E9Pa、泊松比0.3,疲劳分析参数:应力-疲劳曲线表(S-N Curve),应力-疲劳曲线如下图2所示,如果没有合适的数据可使用结构钢材料进行分析。网格为四面体高阶单元,各零件的单元尺寸如下表1所示,单元质量分布如下图3所示。在workbench平台下搭建分析流程如下图6所示,前述设定完成后,提交求解后即可得到相应的应力、应变结果,更新结果后目录树中会有相应的nCode DesignLife插件,如下图7所示。 阅读详情

相关推荐

2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整论文+代码+结果

2024国赛A题参考论文。2024国赛D题参考论文。2024国赛E题参考论文。2024国赛B题参考论文。2024国赛C题参考论文。

qq_52590045的博客 5359

多线程安全问题(sychornized,lock(ReentantLock),volatile,ThreadLocal)

线程安全问题分析: https://blog.youkuaiyun.com/yojofly/article/details/115386382 造成线程安全的原因: 产生原因,cpu,内存,io的读写速率不同,cpu>内存>io 1、原子性问题 2、可见性问题 3、有序性问题 join()规则 如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作(改变公共变量)happens-before(多线程可见)于线程A package com.jokin...

u011441473的专栏 1049

CloudCompare

分割点云:选中要分割的点云文件–>Segment–>左键框出要分割的点或者区域–>Segment Out–>Comfirm Segmentation,原点云文件被分割成两个结构,选中分割出来的remaining,右键delete即可。qSRA (Surface of Revolution Analysis):计算一个点云和一个假定旋转平面之间的距离(旋转平面用2D轮廓定义),距离计算好后,用户可以创建一个偏差的2D图或者圆柱或圆锥的投影。②表现为同样的对象或者至少有同样的形状。

xiaoyaolangwj的博客 4709

线程安全的单例模式

1、普通单例 多线程环境下还是会创建多个对象。 2、使用sycnhronized关键字实现单例 使用sycnhronzied修饰创建对象的方法。只有一个线程能进方法去创建对象保证单例,这种方法没有下面方法的效率高。 3、双重检测单例模式 优点:在多线程的情况下最高性能的使用了锁机制保证了线程安全 缺点:创建对象有三个步骤,A1、分配对象的内存空间,A2、初始化对象,A3、设置引用指向...

老邢的博客 292

Win11下Wezterm配置Powershell默认终端全攻略(含主题同步技巧)

本文详细介绍了在Windows 11系统中,如何安装和配置Wezterm终端模拟器,并将其设置为PowerShell的默认终端。内容涵盖使用Winget或手动安装Wezterm,通过修改.lua配置文件切换默认Shell,并同步Campbell主题配色以还原熟悉的PowerShell视觉体验,旨在帮助开发者打造高效、个性化的命令行工作环境。

weixin_28363123的博客 1237

STM32+W5500实战:5分钟搞定FreeModbus TCP移植(附完整代码)

本文详细介绍了如何在STM32微控制器上,结合W5500以太网芯片,快速完成FreeModbus TCP协议栈的移植,构建稳定可靠的工业级Modbus TCP服务器。内容涵盖硬件连接、软件架构、驱动适配、核心移植代码实现及调试优化技巧,旨在提供可直接应用于实际项目的完整解决方案。

life6的博客 879

Java SE多线程(线程安全与sychornized)

若初次接触移至多线程请先移至JavaSE 多线程初次接触 线程安全与sychornized理解1.作为了解的知识1.1 常见的线程调度模型有哪些?1.2 和线程调度有关的方法2.关于多线程并发环境下,数据的安全问题(重点)。2.1为什么这个是重点2.2什么时候会出现线程安全问题2.3如何解决线程安全问题?2.4异步编程模型与同步编程模型3.Java中三大变量4.如果使用局部变量:5.sychornized(尽我可能写的详细)5.1sychornized理解概念开发中应该怎么解决线程安全问题?(老师讲解) 1

qq_47201748的博客 1877

游戏开发中的AI与RAG技术应用实践

检索增强生成(RAG)技术是当前AI领域的重要突破,它通过结合信息检索与文本生成能力,显著提升了大型语言模型在专业领域的实用性。其核心原理是建立动态知识库,在生成响应前先检索相关专业资料作为上下文。这种技术特别适合解决游戏开发中的复杂问题,如虚幻引擎API查询、角色背景生成等技术场景。在实际工程应用中,RAG系统需要精心设计分层检索策略、缓存机制和硬件加速方案。通过将RAG深度集成到游戏引擎工作流中,开发者可以快速解决技术难题,新成员也能更快掌握引擎特性,大幅提升团队协作效率。

weixin_29323977的博客 534

Java 线程以及sychronizd同步

1.使用情况:在多线程的情况下需要用到,比如public static变量,某一时刻只能一个线程进行操作并改变它的值,要用这个关键字来约束。来保证线程安全 2.简介: 并发的基础知识 什么是线程? 线程有时称为 轻量级进程。与进程一样,它们拥有通过程序运行的独立的并发路径,并且每个线程都有自己的程序计数器,称为堆栈和本地变量。然而,线程存在于进程中,它们与同一进程内的其他线程

Jerry's Home 2631

智元机器人开源具身仿真框架 Genie Sim 入门教程

GenieSim是AgiBot推出的具身智能仿真框架,提供完整闭环开发管道,包括轨迹生成、模型训练和基准测试。框架支持Docker容器化部署,要求Ubuntu 22.04和NVIDIA硬件环境。主要功能涵盖: 支持12种基准测试任务 提供ADER评估框架 集成UniVLA/RDT等基线模型 支持PICO/键盘遥操作 具备轨迹记录回放功能 提供完整API控制接口 开发者可通过Hugging Face获取场景资产,使用标准化ROS主题与仿真环境交互。框架特别优化了碰撞检测和抓取物理模拟,适用于从简单抓取到复杂操

2506_90492529的博客 2544

ABAP Secure Storage 在事务码 SM59 中的应用

系统管理人员在进行维护时,应关注相关日志信息,及时发现可能出现的安全异常,并针对不同安全等级的操作制定相应的备份与恢复策略,以降低潜在风险。该区域在设计上具备高度隔离性,仅允许经过授权的组件访问。保存后,系统会将密码存储在 Secure Storage 中,这种处理方式充分体现了 SAP 标准程序在安全设计上的考量。对于系统管理员而言,这种机制在日常维护与审计中提供了有力的支持,可以通过比对存储数据的哈希值或其他完整性校验手段,及时发现异常变动,保障系统长期稳定运行。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 678

java 多线程之Sychronization的三种使用情况

java 多线程之Sychronization的三种使用情况  1.同步代码块     锁对象可以是任意的对象  2.普通同步方法 锁对象默认是是 this  3.静态同步方法 锁对象是当前类的class对象 测试类如下: package Sychronization; /**  * 测试类  * @author feige  */ public class Sychroniz

飞升飞的博客 4837

LVGL 磁罗盘效果

环境:LVGL 9.x + SDL2,窗口 1280×800。界面文案用英文(默认 Montserrat,无 CJK)。本文按实现顺序讲:先建立两个耦合转动体,再把磁倾角误差从卡面倾斜里推出来,最后用同一套投影把刻度、数字和目标画到卡上。画面上的迟滞、涡流、摆动和读数偏差都来自方程,没有补间动画。

摸鱼专家 104

浅谈Sychronized和ReetrantLock

在我们的日常开发中,我们很多时候会或多或少的遇到一些并发场景,比如在某个订单模块或者秒杀块,多个用 户在同一时间内点击抢单和下单,后台是如何处理线程安全问题呢?底层实现原理又是什么? 我们常规的处理方法可能是使用Sychronized和ReentrantLock进行处理,在资源竞争相对不是很激烈的时候 Synchronized同步方式要比ReentrantLock加锁的方式性能要好,随着并发量...

浅瞳夜未的博客 926

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IEM模型,地表粗糙度模拟

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

java线程安全理解

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。   在单线程运行的情况下,如果 Si...

weixin_34389926的博客 153

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Java集合】浅谈ConcurrentHashMap

在竞争激烈的场景下使用HashMap会造成CPU狂飙,这个时候我们就可以使用ConcurrentHashMap来代替HashMap了。 在ConcurrentHashMap中,不允许使用null作为键和值。 JDK1.7版本的ConcurrentHashMap的实现原理 ConcurrentHashMap使用分段锁技术,将数据分为一段段的存储,,然后给每一段数据配一把锁,当一个线程占用...

Soldier49Zed的博客 290

假人有限元模型

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

浅谈Java中的锁:Synchronized、重入锁、读写锁

Synchronized 首先我们来看一段简单的代码: public class NotSyncDemo { public static int i=0; static class ThreadDemo extends Thread { @Override public void run() { for (int j=0;j&l...

zhuguang10的博客 144

synchronized不能锁静态变量_你用对锁了吗?浅谈 Java “锁” 事

并发 BUG 的源头我们知道电脑有CPU、内存、硬盘,硬盘的读取速度最慢,其次是内存的读取,内存的读取相对于 CPU 的运行又太慢了,因此又搞了个CPU缓存,L1、L2、L3。正是这个CPU缓存再加上现在多核CPU的情况产生了并发BUG。这就一个很简单的代码,如果此时有线程 A 和线程 B 分别在 CPU - A 和 CPU - B 中执行这个方法,它们的操作是先将 a 从主存取到 CP...

weixin_39867200的博客 1983

Java多线程模拟售票程序,及线程安全问题

Java中线程部分知识中,售票程序非常经典。程序中也有一些问题存在!  需求:模拟3个窗口同时在售100张票。 问题1:为什么100张票被卖出了300张票? 原因:因为tickets是非静态的,非静态的成员变量数据是在每个对象中都会维护一份数据的,三个线程对象就会有三份。  解决方案:把tickets票数共享出来给三个线程对象使用。使用static修饰。 问题2: 出现了线程安全问题 ?

sy7571871的博客 3377

确保线程安全的几种方法

本文首先对线程进行简单的介绍,然后介绍几种保证线程安全的方法。

周兆熊的专栏 3万+

线程安全

今天就线程安全问题和解决方案进行了深入学习。 线程安全 多线程的执行顺序不可重现,但是必须要求执行结果必须可以重现 线程的共享数据操作不完整性就一定会出现数据被破坏,而导致结果无法预知的问题—线程的安全问题 同步处理的引入 在java语言中存在两种内建的synchronized语法:synchronized代码块和synchronized方法( 静态方法和非静态方法)可以解决线程安全问题 首先synchronized将并行改为串行,当然会影响程序的执行效率,执行速度会受到影响。其次synchronized操

weixin_53854631的博客 564

java线程同步之synchronized

总结: 1、synchronized关键字的作用域有二种: 1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的s

huangzihao100的专栏 481

4、Synchronized 保证线程安全的原理

理论层面  Synchronized 可以保证方法或者代码在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性    java中每一个对象都可以作为锁,这是synchronized实现同步的基础普通同步方法,锁是当前对象的实例静态同步方法,锁是当前类的class对象同步方法快,锁是括号里面的对象    当一个线程访问同步代码块时,首先需要先获取锁才能执行同步代码块,...

一个人的博客 1947

15-synchronized保证线程安全的原理(jvm层面)

synchronized用于代码块 代码: public int xx () { // monitorenter synchronized (Sequence.class) { if(value > 0) { return value; } else { return -1; } } // monitorexit ...

cckkpp的博客 1078

14-synchronized保证线程安全的原理(理论层面)

我们本讲开始来正式解决我们之前所遇到的线程安全性问题,回顾之前的内容,我们实现了一个数值序列生成器,那么,这个数值序列生成器呢,在我们多线程的环境下,会发现,生成的数值序列不是我们所预期的那种递增的序列,而是会出现那种我们所不预期的错误,不符合我们预期的错误,但是,我们当时的解决方案比较简单,就在那个方法上加了一个synchronized,于是,这个问题就解决了,我们并没有去详细的解释为什么在方法...

G_66_hero的博客 936

synchronized的底层原理以及synchronized是怎样保证线程安全

synchronized(关键字)的底层原理? synchronized 关键字底层原理属于 JVM 层面。 ① synchronized 修饰代码块的情况 synchronized 同步语句块的实现使⽤的是 monitorenter 和 monitorexit 指令,其中 monitorenter指令指向同步代码块的开始位置,monitorexit 指令则指向同步代码块的结束位置。 当执⾏monitorenter 指令时,线程试图获取锁也就是获取monitor的持有权。(monitor对象存在于每个Jav

weixin_49224542的博客 2657
上一篇: 线程是什么
下一篇: Lock的学习与使用
西红柿丶番茄
博客等级 码龄10年 21粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值