synchronized的介绍

1.synchronized的介绍和作用

synchronized是Java编程语言中的一个关键字,用于实现线程同步。在多线程编程中,多个线程可能同时访问共享资源,而这可能导致数据不一致或其他问题。为了避免这些问题,可以使用 synchronized 关键字来确保在任何时候只有一个线程可以访问共享资源。

使用synchronized就是为了保证线程的三个特性,及原子性、可见性、有序性。原子性:一个或多个操作时,保证要么全部执行成功,要么都不执行。可见性:一个线程操作时,另外的线程可以看见,里面的数据变化情况能看见。有序性:线程安装顺序进行操作。使用锁就是为了保证线程的安全。

2.synchronized的使用

public synchronized void lock(){//方法
}
​
public void lock() {// 一些非关键代码
​synchronized (lockObject) {// 需要同步的代码块}
​// 一些非关键代码
}

synchronized可以修饰静态方法、成员函数,同时还可以直接定义代码块。

3.synchronized的底层实现

在Java虚拟机(JVM)中,对象的内存结构主要分为三部分:对象头、实例数据、对齐填充。

对象头:

  • 存储对象自身的运行时数据,比如哈希码、垃圾回收信息、同步锁等。

  • 不同的虚拟机实现会在对象头中存储不同的信息,例如,在HotSpot虚拟机中,对象头占用的空间大小是与平台相关的。

实例数据:

  • 存储对象的实际数据,即类的字段内容。

  • 对于数组类型的对象,还包括数组长度等信息。

  • 实例数据的大小取决于对象所属的类的字段定义。

对齐填充:

  • 由于虚拟机的内存分配规则,对象的大小通常要求是8字节的整数倍。

  • 对齐填充用于填充对象的实例数据,以满足对齐要求,使得对象的起始地址是8字节的整数倍。

  • 对齐填充不包含实际的数据,仅仅是为了对齐。

对象头中Mark Word是重点

监视器(Monitor)图:借图

image-20231130202028161

这个是获取Monitor和释放Monitor的流程。

在jdk1.6之前synchronized被称为重量级锁,在jdk1.6之后,进行了优化,引入了偏向锁和轻量锁。

4.synchronized的优化

4.1偏向锁

原理:

当锁对象第一次被线程获取的时候,虚拟机将会把对象头中的标志位设为“01”,即偏向模式。同时使用CAS操作把获取到这个锁的线程的ID记录在对象的MarkWord之中,如果CAS操作成功,持有偏向锁的线程以后每次进入这个锁相关的同步块时,虚拟机都可以不再进行任何同步操作,偏向锁的效率高。

好处:

偏向锁是在只有一个线程执行同步块时进一步提高性能,适用于一个线程反复获得同一锁的情况。偏向锁可以提高带有同步但无竞争的程序性能。

4.2轻量级锁

原理:

将对象的Mark Word复制到栈帧中的Lock Recod中。Mark Word更新为指向Lock Record的指针。

好处:

在多线程交替执行同步块的情况下,可以避免重量级锁引起的性能消耗。

4.3自旋锁和自适应自旋锁

轻量级锁失败后,虚拟机为了避免线程真实地在操作系统层面挂起,还会进行一项称为自旋锁的优化手段。
​
自旋锁:许多情况下,共享数据的锁定状态持续时间较短,切换线程不值得,通过让线程执行循环等待锁的释放,不让出CPU。如果得到锁,就顺利进入临界区。如果还不能获得锁,那就会将线程在操作系统层面挂起,这就是自旋锁的优化方式。但是它也存在缺点:如果锁被其他线程长时间占用,一直不释放CPU,会带来许多的性能开销。
​
自适应自旋锁:这种相当于是对上面自旋锁优化方式的进一步优化,它的自旋的次数不再固定,其自旋的次数由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定,这就解决了自旋锁带来的缺点。

参考:

https://www.cnblogs.com/three-fighter/p/14396208.html

深入理解synchronized底层原理,一篇文章就够了!-腾讯云开发者社区-腾讯云

面试官:请详细说下synchronized的实现原理 - 知乎

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

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

相关文章

华尔街日报:中国加密货币交易“非法却盛行”,VPN翻墙、微信找币商、线下面交……

《华尔街日报》戏谑地称,中国的投资者曾经是加密货币交易的主导力量,人民币是用于交易比特币最受欢迎的法定货币。而现在,中国的币圈投资者正努力规避政府对加密货币交易的严格规定。 事实上,在过去几年里,中国大陆与加…

无需编程,简单易上手的家具小程序搭建方法分享

想要开设一家家具店的小程序吗?现在,我将为大家介绍如何使用乔拓云平台搭建一个家具小程序,帮助您方便快捷地开展线上家具销售业务。 第一步,登录乔拓云平台进入商城后台管理页面。 第二步,在乔拓云平台的后台管理页面…

自动化工具 基于 Antd+DRF 开发了一款适配 JMeter 的接口自动化测试报告

JMeter Report 基于 AntdDRF 开发的一款 JMeter 测试报告服务,用于在 JMeter 接口测试中使用。 🌴 背景 JMeter 是测试工作中常用的一款工具,除了压测还可以用来做接口自动化的测试。 从事测试多年,接口自动化也做过很多的尝试…

链表存数相加算法(leetcode第2题)

题目描述: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这…

WebSocket协议、与HTTP对比

WebSocket 也可前往本人的个人网站进行阅读 WebSocket 和 HTTP WebSocket和HTTP协议一样,都是基于TCP协议实现的应用层协议。 HTTP协议通常是单边通信,主要用于传输静态文档、请求-响应通信,适用于Web浏览器加载网页、API调用等。然而Web…

Message queue 消息队列--RabbitMQ 【基础入门】

一,Message queue介绍: 1.1使用消息队列的优点: 服务之间最常见的通信方式是直接调用彼此来通信,消息从一端发出后立即就可以达到另一端,称为即时消息通讯(同步通信) 消息从某一端发出后,首先进入一个容器进行临时存储,当达到某种条件后,再由…

Vray渲染效果图材质参数设置

渲染是创造出引人入胜视觉效果的关键步骤,在视觉艺术领域尤为重要。不过,渲染作为一个资源密集型的过程,每当面对它时,我们往往都会遭遇到时间消耗和资源利用的巨大挑战。幸运的是,有几种方法能够帮助我们优化渲染&…

室内机器人区域覆盖算法仿真测试平台设计与实现(预告)

前一篇: 户外机器人区域覆盖算法仿真测试平台设计与实现(预告) 基本完全是人工智能生成的内容。 之前此课题只是课程中的一个项目案例。 ROS1云课→32愉快大扫除 但是可以感觉到过于宽泛,没有任何具体实践,比如使用…

计算机硬件 5.2组装整机

第二节 组装整机 一、准备工作 1.常用工具:中号十字螺丝刀、尖嘴钳、软毛刷、防静电手环等。 2.组装原则: ①按“先小后大”“从里到外”的顺序进行,不遗漏每一环节,不“带病”进行下一环节。 ②合理使用工具器材,…

linux内核视角看阻塞式IO

一、概述 网络包从网卡送到协议栈后,内核还有一项重要的工作,就是要能通知用户进程,让用户进程能够收到并处理这些数据。用户进程和内核的交互一般有两种典型的方案,一种是同步阻塞,另一种是多路IO复用。 二、内核so…

AEB滤镜再破碎,安全焦虑「解不开」?

不久前,理想L7重大交通事故,再次引发了公众对AEB的热议。 根据理想汽车公布的事故视频显示,碰撞发生前3秒,车速在178km/h时驾驶员采取了制动措施,但车速大幅超出AEB(自动紧急刹车系统)的工作范…

App开发——国际化多语言的实现

1.引言 我们当前正处于一个全球化的世界,所以我们开发的 App 也会有很大的概率,需要满足国际化多语言的需求。今天刚好看到有个小伙伴遇到了这个需求需要实现,这里就借此机会,简单讲解一下,在 YonBuilder移动开发 技术…