为了账号安全,请及时绑定邮箱和手机立即绑定

Java高并发之魂:synchronized深度解析

难度入门
时长 2小时50分
学习人数
综合评分9.53
114人评价 查看评价
9.7 内容实用
9.3 简洁易懂
9.6 逻辑清晰
  • http://img1.sycdn.imooc.com//62666d1f000149ca13180664.jpg

    1.效率问题 2.看业务,优先考虑synchronized(简单) 3.主要判断被锁的对象

    查看全部
    0 采集 收起 来源:常见面试问题

    2022-04-25

  • http://img1.sycdn.imooc.com//6266696d00010bfd13170688.jpg

    直到等于0时,那个锁才算是彻底释放了

    查看全部
    0 采集 收起 来源:可重入原理

    2022-04-25

  • http://img1.sycdn.imooc.com//6266689f0001580c13310689.jpg

    Synchronized编译后,会生成monitorenter-加锁,monitorexit释放锁

    查看全部
    0 采集 收起 来源:看monitor指令

    2022-04-25

  • https://img1.sycdn.imooc.com//626664e100014ccb10140468.jpg

    https://img1.sycdn.imooc.com//626664ef00013f7808900458.jpg

    答案:1.先后 2.同时 3.先后 4.同时 5.先后 6.同时 7.会

    查看全部
  • 本课程的知识点回顾

    查看全部
    0 采集 收起 来源:课程的总结_

    2022-02-20

  • 1、读写锁:读的时候可以多线程执行

    2、将synchronized替换为lock

    查看全部
    0 采集 收起 来源:思考题

    2022-02-20

  • synchronized的缺陷:效率低、不够灵活、不知道是否成功获取了锁

    查看全部
    0 采集 收起 来源:Synchronized缺陷

    2022-02-20

  • 第一次进入函数前拿到锁1,递归进入函数时,synchronized的可重入性,决定了锁1依旧可以进入

    查看全部
  • 4、同步方法会有锁,只有一个线程进入,但是非同步方法随意进入,所以会出现并发情况

    5、由于两个同步方法拿到的是同一个锁instance,所以要按照顺序执行

    6、静态方法拿到的是类锁xxx.Class,非静态方法拿到的是对象锁instance,所以会出现并发的情况

    7、一定是先抛出异常,再释放锁

    查看全部
  • 1、两个thread,一个instance==按照顺序执行,加锁成功

    2、两个thread,两个instance==各自持有锁,并发执行

    3、两个thread,一个synchronized修饰的静态方法==此时是一个类锁,即一把锁,按照顺序执行

    查看全部
  • 对象锁(方发锁、同步代码块锁)、类锁(静态方法锁、指定锁为Class对象)

    查看全部
  • synchronized的作用:

    能够保证在“同一时刻”最多只有一个线程执行该段代码,达到保证并发安全的效果

    查看全部
  • synchronized的两个用法

    61ff2bb20001d5f207200404.jpg
    查看全部
  • Synchronized的作用:

    官方:同步方法支持一种简单的策略来防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的。


    一句话说出作用:能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。


    Synchronized的两个用法:

    • 对象锁:

      包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对象)

    • 类锁:

      指synchronized修饰静态的方法或指定锁为Class对象


    性质

    • 可重入

      • 什么是可重入:指的是同一线程的外层函数获得锁之后,内层函数可以直接再次获取该锁

      • 好处:避免死锁、提升封装性

    • 不可中断

      • 一旦这个锁已经被别人获得了,如果我还想获得,我只能选择等待或者阻塞,直到别的线程释放这个锁。如果别人永远不释放锁,那么我只能永远地等下去。


    原理

    • 加锁和释放锁地原理:

      • 获取和释放锁地时机:进入和推出同步代码块(包括抛出异常)

      • 通过monitorenter和monitorexit指令

    • 可重入原理:加锁次数计数器

      • JVM会记录被加锁的次数

    • 保证可见性地原理:内存模型

      • synchronized可以保证可见性


    Synchronized缺陷

    • 效率低:锁的释放情况少、视图获得锁时不能设定超时、不能中断一个正在试图获得锁的线程

    • 不够灵活(读写锁更灵活):加锁和释放的时机单一,每个锁仅有单一的条件(某个对象),可能是不够的

    • 无法知道是否成功获取到锁


    常见面试问题

    • 使用注意点:锁的范围不宜过大、避免锁的嵌套

    • 如何选择Lock和synchronized关键字?

      • synchronized能满足需求优先使用synchronized

      • lock更灵活,但是容易编写代码出错

    • 多线程访问同步方法的各种具体情况

      确定锁对象


    思考题

    • Synchronized使得同时只有一个线程可以执行,性能较差,有什么办法可以提升性能?

      如果是读多写少的情况下,可以使用读写锁代替

    • 我想更灵活地控制锁地获取和释放(现在释放锁的时机都被规定死了),怎么办?、

      可以考虑使用Lock

        

    总结:

    一句话介绍Synchronized:

    JVM会自动通过使用monitor来加锁和解锁,保证了同时只有一个线程可以执行指定代码,从而保证了线程安全,同时具有可重入和不可中断的性质。

    查看全部
    3 采集 收起 来源:课程的总结_

    2022-01-06

  • 重点看是否需要释放锁后再次获取

    查看全部

举报

0/150
提交
取消
课程须知
1、基本的Java语法知识。 2、最基本的线程知识,比如在Java中如何创建线程。
老师告诉你能学到什么?
1、完全学会高并发中synchronized这个最灵魂级解决方案以及一线互联网资深工程师的开发、调试经验,提高填‘坑’能力。 2、synchronized底层原理源码深度解析、适用场景、使用和调试。 3、高并发面试中synchronized的高频经典考察点,让你在面试中和面试官聊到停不下来。

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!