synchronized的介绍

这篇具有很好参考价值的文章主要介绍了synchronized的介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.synchronized的介绍和作用

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

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

2.synchronized的使用

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

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

3.synchronized的底层实现

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

synchronized的介绍,c#,开发语言

对象头:

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

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

实例数据:

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

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

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

对齐填充:

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

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

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

对象头中Mark Word是重点

synchronized的介绍,c#,开发语言

监视器(Monitor)图:借图

synchronized的介绍,c#,开发语言

这个是获取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的实现原理 - 知乎文章来源地址https://www.toymoban.com/news/detail-822484.html

到了这里,关于synchronized的介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • <HarmonyOS第一课>ArkTS开发语言介绍——闯关习题及答案

    判断题 1.循环渲染ForEach可以从数据源中迭代获取数据,并为每个数组项创建相应的组件。( 对 ) 2.@Link变量不能在组件内部进行初始化。( 对 ) 单选题 1.用哪一种装饰器修饰的struct表示该结构体具有组件化能力?( A ) A. @Component B. @Entry C. @Builder D. @Preview 2.用哪一种装饰

    2024年02月07日
    浏览(45)
  • 基于C#语言的GUI开发,主要介绍WPF框架

    下面是几种常见基于.Net的界面开发框架,都是Microsoft提供,下面简介由GPT生成 WinForms (Windows Forms WPF (Windows Presentation Foundation) UWP (Universal Windows Platform) MAUI (Multi-platform App UI) WinForms(Windows Forms): 介绍: WinForms是由Microsoft提供的用于开发Windows桌面应用程序的UI框架。它使用简单

    2024年02月03日
    浏览(42)
  • 软件开发中常用数据结构介绍:C语言队列

    工作之余来写写C语言相关知识,以免忘记。今天就来聊聊 C语言实现循环队列 ,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦 点赞收藏评论+关注 走一波!感谢各位的

    2024年02月11日
    浏览(46)
  • 零基础快速上手HarmonyOS ArkTS开发1---运行Hello World、ArkTS开发语言介绍

    在华为开发者大会2023年8月4日(HDC.Together)大会上,HarmonyOS 4正式发布,其实在2021年那会学习了一点鸿蒙的开发: 不过因为现在的鸿蒙手机完全兼容Android应用,所以学习动力也不是很足,一直就搁置了,直到今年华为官方出了这么一则消息才让我对于学习它有一种紧迫感了,如

    2024年02月05日
    浏览(48)
  • 入门Python编程:了解计算机语言、Python介绍和开发环境搭建

    计算机语言是用来控制计算机行为的一种语言,通过它可以告诉计算机该做什么。计算机语言和人类语言在本质上没有太大区别,只是交流的对象不同。 计算机语言发展经历了三个阶段: 1. 机器语言 机器语言使用二进制编码来编写程序。 执行效率高,但编写起来麻烦。 2

    2024年02月09日
    浏览(65)
  • 华为云中对象存储服务软件开发工具包(OBS SDK) C语言介绍

          华为云的OBS介绍 :摘自华为云官网:https://support.huaweicloud.com/obs/index.html       华为云的对象存储服务(Object Storage Service, OBS)是一个基于对象的海量存储服务 ,为客户提供海量、安全、高可靠、低成本的数据存储能力。       OBS系统和 单个桶都没有总数据容量和对象

    2024年02月09日
    浏览(68)
  • 【go语言开发】go项目打包成Docker镜像,包括Dockerfile命令介绍、goctl工具生成

    本文主要介绍如何将go项目打包成镜像,首先介绍Dockerfile常用命令介绍,然后介绍使用工具goctl用于生成Dockerfile,还可以根据需求自定义指令内容,最后讲解如何将go-blog项目打包成镜像,以及如何运行等 参考文档: docker日常使用,编写dockerfile等 dockerfile编写 开发完项目之后

    2024年01月20日
    浏览(47)
  • 【05】STM32·HAL库开发-C语言基础知识 | stdint.h介绍 | 位操作 | 宏定义的使用 | 条件编译 | extern声明 | typdef使用 | 结构体、指针、代码规范介绍。

      stdint.h 是从 C99 中引进的一个标准 C 库的文件,可以在MDK5的安装路径:D:MDK5.34ARMARMCCinclude中找到。   stdint.h 定义了很多类型别名,将有符号的char类型定义别名为int8_t等,使用此套别名有易于移植。   在MDK中需要配置才能支持使用S99标准, 默认是勾选的 。   只

    2024年02月08日
    浏览(43)
  • SqlSession [.....] was not registered for synchronization because synchronization is not active

    今天运行服务,多线程插入数据库操作的时候( 程序运行正常 ),发现控制台有如下提示信息: will not be managed by Spring 报错信息如下: SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3650604c] was not registered for synchronization because synchronization is not active SqlSession [org.apache.ibat

    2024年02月06日
    浏览(43)
  • 并发-synchronized详解

    JDK1.6之前的synchronized一来就直接给对象加了一把重量级锁,频繁地在用户态和内核态之间切换,导致性能非常低。为了弥补synchronized的不足,大佬doug lee写了一个AQS框架,用Java语言实现了ReentrantLock。然后在JDK1.6之后,oracle优化了synchronized的锁过程,增加了锁的膨胀逻辑

    2024年02月12日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包