Java 同步代码块synchronized

Java高并发编程实战15,Java同步代码块详解 Java基础教程系列,打造精品专栏。 阅读详情

如何使用synchronized  synchronized 关键字​ 同步代码块 synchronized 原理浅析 如何使用Java同步代码块synchronized 

2018年拍摄于日本奈良的小鹿,鹿随便摸,手感棒棒的。

微信公众号

王皓的GitHub:https://github.com/TenaciousDWang

 

上回说到线程的生命周期,今天接着说一下并发编程中肯定会遇到的线程安全问题,线程安全问题只出现在多线程环境,单线程串行环境下不会出现这样的问题,下面引用码出高效中的例子来说明一下。

 

医生坐诊,并发处理多个病人的询问、开化验单、查看化验结果、开药等工作,任何一个环节一旦出现数据混淆,都可能引发严重的医疗事故。

 

延伸到计算机的线程处理过程中,有可能会出现同时访问同一个资源的情况,这种资源可以是各种类型的的资源:一个变量、一个对象、一个文件、一个数据库表等,而当多个线程同时访问同一个资源的时候,就会存在一个问题:

 

  由于每个线程执行的过程是不可控的,所以很可能导致最终的结果与实际上的愿望相违背或者直接导致程序出错。

 

再举一个例子,在服务端有一个账户,里面有10000元,有A线程执行用户查询,并进行扣款100元,有一个B线程执行同样的扣款100元操作,两个线程并发,无法保证执行顺序,A线程查询账户为10000元后交出CPU执行时间片,B线程开始执行也查询账户为10000元,交出CPU执行时间片后,A线程开始扣款10000元-100元写入9900元执行完毕,B线程开始扣款10000元-100元写入9900元执行完毕,这样账户实际扣款200元,但是最后数据却是9900元,而不是9800元,这就是线程安全问题。

 

为保证线程安全,在多个线程并发的竞争一个共享资源时,通常采用同步机制协调各个线程的执行,以确保得到正确的结果。

 

保证高并发场景下的线程安全,可以从以下四个维度来说:

 

1、数据单线程内可见,单线程内总是安全的,数据只在栈内可见,不共享,就不会被其他线程修改。

 

2、使用private final关键字使其只读,只读就不可修改,无法继承,总是安全的。

 

3、使用线程安全的类,比如StringBuffer,ConcurrentHashMap线程安全容器等。

 

4、同步与锁机制,在Java中,提供了两种方式来实现同步互斥访问:synchronized和Lock,线程的核心概念就是“要么只读,要么加锁”。

 

今天主要说一下synchronized关键字,同步代码块,在了解synchronized关键字的使用方法之前,我们先来看一个概念:互斥锁,即能到达到互斥访问目的的锁。

 

举一个简单的例子,还是我们上面所说的账户问题,如果我们给账户这个对象加上互斥锁,当一个线程进行访问时,另一个线程无法访问,必须等待第一个线程访问完并释放互斥锁后,再获取锁来访问,就可以避免刚才出现的扣款问题,这个时候当A线程执行完后,账户写入9900,接下来B线程获取锁进行访问,9900-100后写入9800元,为正常预期。

 

        在Java中,每一个对象都拥有一个锁标记(monitor),这是每个对象与生俱来的一个隐藏字段,也称为监视器,多线程同时访问某个对象时,线程只有获取了该对象的锁才能访问。

 

synchronized锁的特性由JVM负责实现,JVM通过监视monitor来实现同步。方法元信息中会使用ACC_SYNCHRONIZED识别该方法是否是一个同步方法。同时使用monitorenter与monitorexit来获取和释放monitor。

 

使用monitorenter进入时,monitor为0,表示该线程可以继续持有这个锁,并继续后续的代码,并将monitor加1,如果这个线程再次访问则monitor再加1,如果该对象monitor不是0,则其他访问这个对象的代码进入阻塞状态,等待上一个线程的释放。

 

接下来我们来说一下synchronized的实现方式,有两种实现方式:

 

第一种,在方法签名处加synchronized关键字。

 

首先我们先来看一下不加synchronized关键字的运行效果创建一个SynchronizedThread测试线程类。

 

 

创建一个测试类,创建并启动线程。

 

 

       运行结果为。

 

 

我们可以看到,两个线程是交替插入数据的,现在我们在SynchronizedThread类中的insert方法签名处加synchronized关键字,再运行一下。

 

     

运行结果。

 

 

这时,我们可以看到,线程1运行插入完毕后,线程而才开始插入。synchronized关键字起到了锁定对象的效果。

 

这里说一下关于一些使用synchronized方法需要注意的问题,当一个线程正在访问一个对象的synchronized方法,那么其他线程不能访问该对象的其他synchronized方法。

 

   当一个线程正在访问一个对象的synchronized方法,那么其他线程能访问该对象的非synchronized方法。

 

   如果一个线程A需要访问对象object1的synchronized方法1,另外一个线程B需要访问对象object2的synchronized方法1,即使object1和object2是同一类型),也不会产生线程安全问题,因为他们访问的是不同的对象,所以不存在互斥问题。

 

第二种使用synchronized(对象或类){代码}进行同步,这是一个同步代码块,不会锁住整个方法,只会锁住包含的代码。使用原则是尽量的缩小锁住的范围,使锁的时间尽量短,能用同步代码块,就不用同步关键字。

 

我们来改造一下第一个代码案例中的SynchronizedThread类。

 

 

   

  其中synchronized(对象或类)里的对象或类可以new 一个对象,或者使用this表示当前对象的锁。

 

 

      这里的同步代码块更加灵活,不会锁住整个方法,提高执行效率。另外对于静态同步方法,是与上面的同步方式有所区别的,静态同步方法使用的是当前对象的Class对象。

 

  总结一下就是Java中的每一个对象都可以作为锁。

 

   1、对于同步方法,锁是当前实例对象。

 

   2、对于静态同步方法,锁是当前对象的Class对象。

 

   3、对于同步方法块,锁是Synchonized括号里配置的对象。

 

知识图谱中的 Ontology(本体论) 本文的部分图片和内容来自中国科学院自动化研究所刘康老师的课件 Ontology(本体论) Ontology 是(特定领域)信息组织的一种形式,是领域知识规范的抽象和描述,是表达、共享、重用知识的方法。 Ontology 是知识体系构建的关键技术,知识图谱是一种人工智能技术,它的关键在于让计算机能够处理人类的知识。然而,人类脑海中的知识通常是直觉性的,我们无法将这种直觉性的知识直接输入给计算机,On... 阅读详情

相关推荐

Abaqus滞回问题求解—浆锚连接装配式剪力墙滞回模拟

当下土木工程研究生,多数都在从事装配式混凝土构件安全或装配式混凝土构件连接节点力学性能的研究。研究这类问题,几乎脱离不开对有限元软件的使用,Abaqus求解能力非常强大,但模型处理能力相对较弱。装配式混凝土结构的有限元计算与传统现浇结构相比,其节点处理起来相对复杂,计算结果往往需要凸显出连接节点力学特性,所以对建模精程度的要求较高。所以向大家介绍一款工具—HyperMesh软件(一下简称Hm),它是专业的有限元前处理工具,用于处理装配式混凝土构件或连接节点有限元模型比较合适。这篇文章主要介绍如何利用Hm处理

qq_31918049的博客 2901

【Java学习笔记(七十七)】之 synchronized同步方法,同步代码块

本文章由公号【开发小鸽】发布!欢迎关注!!! 老规矩–妹妹镇楼: 一. synchronized同步方法 (一) 非线程安全        非线程安全问题会在多个线程对同一个对象中的实例变量进行并发访问时发生,结果就是获取到已经被修改过的数据,即“脏读”。 (二) 方法内的变量是线程安全的        非线程安全问题针对的是实例变量被并发访问的情况,而存在于方法内部的私有变量是不会被其他方法访问到的,因此不

开发小鸽 1477

MTK6769平台Type-C充电全解析:从硬件管脚到PD协议实战(Android15环境)

本文深入解析了MTK6769平台在Android 15环境下Type-C充电的完整链路。从硬件管脚(特别是核心的CC引脚)功能与连接,到USB-PD协议报文抓取与实战分析,并结合MTK平台PD芯片驱动与充电IC驱动的软件框架,提供了从硬件设计到软件调试的系统性解决方案和常见问题排查案例。

ol78901234的博客 311

java同步块_java并发(八)Java同步块synchronized

锁提供了两种主要特性互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改...

weixin_29959015的博客 285

从Pikachu靶场实战解析越权漏洞:原理、攻击与防御

本文通过Pikachu靶场实战详细解析越权漏洞的原理、攻击方式与防御策略。文章深入探讨水平越权和垂直越权的危害,结合代码示例展示漏洞利用过程,并提供代码层和架构层的立体化防御方案,帮助开发者有效防范这一Web安全隐形杀手。

weixin_29325007的博客 357

RK3568平台开发系列讲解(安卓篇)LED呼吸灯系统流程

1.app层封装后使用NotificationManager发出:NotificationManager.notify() 2.Android 系统架构中:一个manager类对应一个aidl接口,一个manager对应一个底层的服务,notification也是这个架构

内核笔记 3646

java同步块介绍

同步块是 Java 中的一种同步机制,用于保护代码块,以确保同一时间只有一个线程能够执行该代码块。同步块通过一个对象的监视器(锁)来实现,即只有获得该对象的监视器的线程才能执行同步块内的代码。这种写法用于在多线程环境中保护对对象的访问,确保在同步块内对该对象的操作是线程安全的。通过使用同步块,可以避免并发修改异常,保证数据的一致性和线程安全性。

qq_27390023的博客 383

Xilinx平台SRIO介绍(一)RapidIO协议介绍

菜鸟到老鸟:会用工具; 老鸟到大佬:深入理解原理。 ——FPGA大叔·沃自己硕得

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

Java基础学习——Java线程(二)同步代码块、同步方法、Lock锁、死锁程序例子、不同类型的锁

1

skx1102195517的博客 2819

《QGIS快速入门与应用基础》079:KML/KMZ格式:Google Earth兼容

KML/KMZ是专为地理可视化设计的空间数据格式,原生兼容Google Earth,支持点线面要素标注与多媒体集成。KML为XML文本格式,KMZ是其压缩版本。该格式优势在于可视化表现力强、跨平台共享便捷,适合地理标注、路线分享等场景,但存在属性支持弱、大数据量处理效率低等局限。QGIS中可便捷加载和导出KML/KMZ数据,需注意编码设为UTF-8、勾选"导出样式"以保留可视化效果。建议中小规模标注数据使用KMZ格式,确保关联资源完整,提升共享效率。

LuckyHanMo的博客 767

大模型LoRA微调调参的实战技巧(持续更新)

本文主要介绍了大模型LoRA微调调参的实战技巧,希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 实战技巧

herosunly的博客 20万+

java同步代码块作用_Java的synchronized的同步代码块和同步方法的区别

线程同步问题大都使用synchronized解决,有同步代码块和同步方法的两种方式,主要记一下这两种的区别测试代码:1 packagecom.xujingyang.testThread;23 public classSynObj{4 public synchronized voidshowA(){5 System.out.println("showA..");6 ...

weixin_39949894的博客 361

vivo X200 Ultra前瞻系列(1):重塑影像旗舰标准

在色彩风格化、视频专业度上实现了安卓阵营的突破性进步。其2亿像素长焦、双LYT-818传感器及5轴防抖技术,对追求个性化创作的用户具有强吸引力。若真机表现能兑现硬件承诺,X200 Ultra有望重新定义手机影像的“专业”标准。然而,其厚重设计、价格门槛及生态适配问题,仍需市场检验。vivo X200 Ultra作为2025年上半年影像旗舰,以“全焦段夜视仪+电影级视频”为核心卖点,主打。,对标小米15 Ultra、OPPO Find X8 Ultra等竞品。,顶配版(24GB+2TB)逼近万元。

专注:太空算力、AI infra、异构调度、大模型成本工程 963

Java多线程编程二(synchronized同步方法和synchronized同步代码块)

对象及变量的并发访问一、synchronized同步方法 本文主要讲述如何解决非线程安全问题 一、synchronized同步方法 方法内的变量为线程安全 “非线程安全“问题存在与实例变量中,如果是方法内部的私有变量,则不存在“非线程安全“问题,也就是线程安全的。 public class MyThread extends Thread { @Override public v...

qq_33225399的博客 1436

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JAVA 同步代码块synchronized

//仅作为学习笔记 /* JAVA对于多线程的安全问题提供了专业的解决方式 就是同步代码块 synchronized(对象)//这个对象可以为任意对象 { 需要被同步的代码 } 对象如同锁,持有锁的线程可以在同步中执行 没持有锁的线程即使获取CPU的执行权,也进不去 同步的前提: 1,必须要有两个或者两个以上的线程 2,必须是多个线程使用同一个锁 必须保证同步中只能有一个线程在

wu_lai_314的专栏 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java中的synchronized同步代码块和同步方法的区别

下面这两段代码有什么区别? //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized (obj){} } synchronized用于解决同步问题,当有多条线程同时访问共享数据时,如果不进行同步,就会发生错...

weixin_30553837的博客 224

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Synchronized使用、 java对象在JVM内存模型中的构成、 synchronized同步代码块的底层原理、 synchronized同步方法的底层原理

文章目录参考Synchronized 使用java对象在 JVM内存模型 中 的构成synchronized 同步代码块 的底层原理synchronized 同步方法 的底层原理 参考 https://blog.youkuaiyun.com/qq_35190492/article/details/106180781 https://www.cnblogs.com/lukelook/p/9946065.html https://baijiahao.baidu.com/s?id=1612142459503895416 S

LYPvvvLYP的博客 287

Java之线程同步(同步方法、同步代码块)(关键字synchronized)(案例分析)

本篇博客文章是关于多线程的并发编程(同步方法、同步代码块)。主要的解决方法:提到了同步方法、同步代码块的作用与使用。其中涉及到的关键字有synchronized、volatile。通过讲述一个实际生活案例来逐步分析、解决问题。里面详细的讲到了"synchronized"关键字的作用,以及如何在代码块上、方法上使用它。最后还提到了代码中的锁是"锁对象"以及对象的构成(详细后面会提到)

岁岁岁平安的博客 2302

Java多线程之【synchronized代码块】与【synchronized同步方法】的区别

【代码】【java多线程Synchronized代码块与Synchronized同步方法区别】

qq_25413913的博客 468

Java的synchronized的同步代码块和同步方法的区别

Java的synchronized的同步代码块和同步方法的区别 synchronized同步方法和同步代码块的区别 同步方法默认使用this或者当前类做为锁。 同步代码块可以选择以什么来加锁,比同步方法更精确,我们可以选择只有会在同步发生同步问题的代码加锁,而并...

199

java synchronized块_Java多线程同步代码块Synchronized

Java多线程同步代码块SynchronizedJava中的每个对象都有一个与之关联的内部锁(Intrinsic lock). 这种锁也称为监视器(Monitor), 这种内部锁是一种排他锁,可以保障原子性,可见性与有序性。内部锁是通过synchronized关键字实现的.synchronized关键字修饰代码块,修饰该方法。修饰代码块的语法:synchronized( 对象锁 ) {同步代码块,...

weixin_33242139的博客 90

java 同步块 同步方法_java中synchronized(同步代码块和同步方法)详解及区别

java中synchronized(同步代码块和同步方法)详解及区别问题的由来:看到这样一个面试题://下列两个方法有什么区别public synchronized void method1(){}public void method2(){synchronized (obj){}}synchronized用于解决同步问题,当有多条线程同时访问共享数据时,如果进行同步,就会发生错误,Java提供的...

weixin_35718575的博客 214

java 同步代码块、同步方法:synchronized

/** * * 1.什么情况下需要同步 * 当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步. * 如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码. * 2.同步代码块 * 使用synchronized关键字加上一个锁对象来定义一段代码, 这就叫同步代码块...

Pastthewind的博客 888

java多线程 synchronized 同步,同步方法,同步代码块,同步实例

synchronized 同步,同步方法,同步代码块,同步实例 一、synchronized有啥用呢? 一句话,解决多线程中的并发问题。 具体在什么情况下使用到呢? (1)资源共享 (2)多个线程同时操作同一个资源 当多个线程中出现以上两种情况的时候,被操作的共同资源则会混乱,出现非预期结果, 二、并发编程的原则 ...

FireAny2010的专栏 494

java 方法前加同步_java中的synchronized(同步代码块和同步方法的区别)

问题的由来:看到这样一个面试题://下列两个方法有什么区别public synchronized void method1(){}public void method2(){synchronized (obj){}}synchronized用于解决同步问题,当有多条线程同时访问共享数据时,如果不进行同步,就会发生错误,java提供的解决方案是:只要将操作共享数据的语句在某一时段让一个线程执行完,...

weixin_29913663的博客 798

java同步代码块弊端_synchronized同步方法的弊端和解决方法(同步代码块)

当两个或多个并发线程访问同一个对象中的synchronsized方法(或代码块)时,一段时间内只允许一个线程访问,所以其他线程必须等待当前线程执行完才能执行。话不多说看示例:synchronized同步代码块示例Task.javapublic class Task {private String getData1;private String getData2;public synchronize...

weixin_39942037的博客 493
上一篇: ​Java 线程的生命周期 Thread类的使用
下一篇: Java 虚拟机对Synchronized的优化
JavaBoy王皓
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值