synchronized 简单执行过程

Synchronized锁原理以及升级过程 Synchronized 中对象头MarkWord的深入理解 阅读详情

并发编程三大原则之初识synchronized-CSDN博客

在上一篇文章中,我们已经知道了,synchronized关键字的基本使用了。那么我们是不是需要了解一下,这个关键字到底在程序中是如何使用的,是怎么保证并发编程的,三个原则的。

首先,我们看一下在我们的java程序被编译成 class 文件后,这个关键字在 class 文件中,是已什么样的方式展示出来的。

这个是.java文件中的定义。

这个是 字节码中,synchronized 所展示出来的样子,就是把 synchronized 所包含的代码块,使用了两个 指令 给包起来了。

MONITORENTER  进入监视器。

MONITOREXIT 退出监视器。

以上是从 java 文件到字节码的展示结果。

我对于监视器的两个关键字的理解就是,在程序中,添加了提示装置,当程序读到 MONITORENTER 这个指令的时候,那么 jvm 就会知道我即将运行的是一段被 synchronized 修饰的代码段。

MONITOR 在jvm所对应的就是ObjectMonitor 对象,这个对象里面包含了很多信息。

拿一个比较重要的信息举例:

owner:一开始这个是 null 一旦有线程操作,同步代码块,那么这个owner就会被赋值成为当前对象。在owner没有被赋值为 null 的时候,其他线程是无法操作同步代码块的内容。(这个在我看来的话就是保证了线程执行代码的原子性,就是你关上门,自己吃苹果,你没有吃完,其他人进不去

于是乎,jvm 就开始对该对象的 markworld 进行分析,得出当前锁的一个状态,得出来不同的状态值后呢,还会得出当前对象是个什么级别的锁。然后 jvm 在调用C++代码中,不同的 case 块,来执行不同的逻辑,举个例子:

在 C++ 层面执行代码的时候,会把 class 翻译成汇编码,丢给操作系统去完成,需要做的事情。

这里面还有一个事情就是在 执行 synchronized 代码块的时候,汇编指令前面会加上一个 lock 指令,在 cpu 看到有 lock 指令的时候,就会触发 总线嗅探机制,这个机制的目的是为了保证数据的一致性。当多线程在操作共享变量的时候,一个线程操作完,会立马通过总线刷新到主存中,在经过总线的时候,总线就会通知其他使用到,该变量的线程内部的副本变量,就会失效,用的时候必须要从主存中重新加载才行。

这里面的总线,你简单的理解成,CPU 和 主存 之间连线。

通过 加上 lock 指令,就可以保证并发编程的,数据的可见性。

那么有序性是怎么保证的呢,这个在 synchronized 并没有很好的体现出来,因为这个关键字保证不了有序性,后面会通过 DCL 的实现方式来验证该问题。也会给出保证有序性的解决方案。

国科大学习资料--机器学习方法与应用(叶齐祥)-期末考试题整理 国科大学习资料–机器学习方法与应用-期末考试题整理 ============================================================================================================================================================================================ ======================================= 阅读详情

相关推荐

uniapp [全端兼容] - 详细实现接入使用海康威视监控云端显示及控制功能,网站集成安装海康监控及实时监控显示、摄像头控制,实时推流、回放、放大缩小画面、视频画面截图、截屏抓拍及播放器解决延迟教程

uniapp,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,vue,海康威视,海康监控,摄像头监控,实时监控画面,海康插件,无法连接,报错,uniApp对接海康处理接口认证规则,监控实时预览和回放功能,海康api接口,安全认证,海康开放平台,官方文档,播放海康摄像头的监控视频,海康实时监控播放详细步骤,web,黑屏,视频播放,回放,视频流地址,取流协议,视频sdk播放,hik,rtsp,rtmp,hls,ws,网站,网页,h5页面,后台管理系统,对接海康监控设备

🏆 前端领域优质创作者 1万+

Java多线程进阶】synchronized工作原理

本期讲解:synchronized的工作原理,无锁、偏向锁、轻量级锁、重量级锁。

我的主页 1271

NSLock和@synchronized

通过简单的例子来说明NSLock和@synchronized执行和加锁流程

说一下synchronized的运行过程

线程执行完同步代码后,释放监视器锁,唤醒入口集中的一个或多个线程。等待的线程会重新尝试获取锁。修饰的方法或代码块时,它必须首先获取对象的监视器锁。获取锁的线程进入临界区,执行同步代码。当线程试图进入一个被。

m0_63212669的博客 299

synchronized执行流程

synchronized执行流程

荣山的博客 549

synchronized原理和优化过程

如果某一个资源被多个线程共享,为了避免因为线程的抢占资源而出现线程不安全的因素,我们需要对线程进行同步,synchronized就是为了保证不会因为线程的抢占式执行而出现的bug。是并发编程中的一个重要的特性。那么接下来就看明白synchronized的底层原理。synchronizedJava并发编程中是非常重要的一个知识点。希望通过上述的描述,对synchronized有个整体的认识。如有不妥,还请多多包涵。

qq_63525426的博客 1140

Java并发编程之synchronized原理分析和执行流程

在理解synchronized原理之前,先理解什么是内置锁。 多线程的锁,其实本质上就是给一块内存空间的访问添加访问权限,因为Java中是没有办法直接对某一块内存进行操作的,又因为Java是面向对象的语言,万物皆对象,所以具体的体现就是某一个对象承担锁的功能,每一个对象都可以是一个锁。 内置锁,它是一个互斥锁,即最多只有一个线程能够获得该锁。使用方式就是使用 synchronized 关键字...

zp的博客 899

JVM学习笔记】图解Java Synchronized执行过程

- Synchronized用来给对象加锁,一段简单的示例代码: public class SynchronizedDemo { //实例方法,同步方法,加锁对象是当前实例 public synchronized void lockInstance() { System.out.println("Instance"); } public void lockThis() { ...

YHALcong的博客 584

synchronized加锁过程

synchronized

weixin_45632417的博客 2148

Synchronized详细介绍之锁升级过程

Synchronized详细介绍之锁升级过程前言线程与进程的区别进程线程区别协程二级目录三级目录 前言 我们在并发编程过程中,会有一些资源或者操作是必须要进行序列化访问的,就是线程之间不能并发的访问,必须要进行串行访问,所以就引入了锁的概念,java中只用的锁主要有两种,一种是jdk内置的锁,一种是juc包下面的锁,jdk内置的锁是不要释放的,由jvm自动给我们释放锁,而juc包下面的锁是有Doug Lea大神开发的,在编程的时候需要在finally进行锁的释放,否则很容易导致死锁; 线程与进程的区别 谈到

JAVA技术爱好者 3968

synchronized加锁原理以及锁升级过程

由于synchronized中用到了CAS技术,此处先对CAS做个简单介绍。是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败。CAS(V,A,B)操作中至少包含三个操作数——需要读写的内存位置(V)、进行比较的预期原值(A)和拟写入的新值(B)。如果内存位置V的值与预期原值A相匹配,那么处理器会自动将该位置值更新为新值B。否则处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。在。

cxbtdd的博客 1768

Synchronized底层核心原理

本篇文章是关于并发编程中Synchronized锁的底层核心原理知识记录,由于篇幅原因,下篇文章将介绍各种锁的优化原理。

小威的博客 8660

synchronized锁升级过程

synchronized 上锁,其实锁信息是加在对象头中的 markdown,对象中的前四个字节表示markdown;的方式,尽可能的把自身的LR设置到 markdown中,若设置成功,makrdown会有。有多个线程竞争synchronized锁时,先把偏向锁撤销,通过自旋的竞争(自旋锁)升级。不一定,偏向锁只有在单线程环境中效率最高;偏向锁每重入一次,在线程栈中都会生成一个LR,但这个LR的值等于NULL,重入次数。轻量级锁重入次数与偏向锁差不多,锁重入次数都是记录在线程栈的LR重,每重入一次也是。

liang8999的博客 3131

Javasynchronized 锁升级的过程

一个synchronized 同步代码块被线程首次进入的时候会获取偏向锁 锁对象就会进入“偏向模式” 在偏向模式下 锁对象就会偏向第一个线程(就像初恋一样)然后 如果说下一次有一个线程来访问如果是刚开始进来的那个线程的话(初恋线程)那么就不用加锁了(不用使用monitorentry、monitoreit )这样的话就节省了加锁的时间 ,如果要进来的不是初恋线程怎么办,要是这样的话“偏向锁”就会升级成轻量锁。大家稍微了解一下即可 主要是为了辅助理解“轻量锁“,接下来咱们开始说“轻量锁”。

qq_57070423的博客 1057

Synchronized的基本概念和原理

SynchronizedJava中用于实现线程同步的关键字。它可以用来修饰方法和代码块,以实现对多线程访问共享资源的同步控制。

Lzm的博客 419

【多线程】Synchronized 用法详解

Synchronized 用法详解

Gmerrysong 的博客 744

synchronized三种使用方式(有图)

什么是线程安全 从图中可以看出线程安全只要包括变量在多个线程之间共享、生命周期内状态可以改变、最后结果和预期一致,就是线程安全的。 Synchronized的三种使用方式 1.普通同步方法(实例方法)锁是当前实例对象,进入同步代码前要获得当前实例的锁 2.静态同步方法,锁是当前类的class对象,进入同步代码前要获得当前类对象的锁 3.同步方法块,锁是括号里面的对象,对给定对象加锁,进入同步代...

半页童话 3035

Java锁分析 - Synchronized执行流程

乐观锁 vs 悲观锁 乐观锁  总是认为不会产生并发问题,因此并不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。 悲观锁 总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁等),当其他线程想要访问数据时,都需要阻塞挂起。   Java线程阻塞的代价 Java的线程是映射到操作系统原生线程之上的,如...

linyinpeng1989的博客 742

Synchronized加锁后线程的基本执行流程

当一个线程Thread-2执行到同步代码块,会判断其有没有指向一个monitor,如果没有的话,Thread-2就会占用Owner,其他的线程再次执行到同步代码块时,发现指向了monitor,其他的线程就会放到EntryList中,并处于阻塞操作,等待持有锁的资源完成。完成之后,就会从EntryList取出一个再执行。 注意: synchronized必须是进入同一个对象的monitor才有上述效果 不加synchronized的对象不会关联监视器,不遵从以上规则 ...

黄坤的博客 392

商用车VCUsimulink程序

商用车VCUsimulink程序,可以用来学习simulink代码生成,可以学习VCU控制策略。 商用车VCUsimulink程序,可以用来学习simulink代码生成,可以学习VCU控制策略。

上一篇: 并发编程三大原则之初识synchronized
下一篇: 简单工厂简单说
专注一点
博客等级 码龄11年 354粉丝 15原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值