专栏首页用户7737280的专栏synchronized三种使用方式
原创

synchronized三种使用方式

修饰静态方法: 也就是给当前类加锁,会作用于类的所有对象实例,因为静态成员不属于任何一个实例对象,是类成员( static 表明这是该类的一个静态资源,不管new了多少个对象,只有一份)。所以天猫转让如果一个线程A调用一个实例对象的非静态

synchronized 方法,而线程B需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁。

✓修饰代码块: 指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

总结: synchronized 关键字加到 static 静态方法和 synchronized(class)代码块上都是是给 Class 类上锁。synchronized 关键字加到实例方法上是给对象实例上锁。尽量不要使用 synchronized(String a) 因 为JVM中,字符串常量池具有缓存功能!

synchronized 关键字的底层原理

synchronized 关键字底层原理属于 JVM 层面 ① synchronized 同步语句块的情况–同步代码

同步语句块的实现使用的是 monitorenter 和 monitorexit 指令,其中monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。当执行 monitorenter 指令时,线程试图获取锁也就是获取 monitor(monitor对象存在于每个Java对象的对象头中,synchronized 锁便是通过这种方式获取锁的,也是为什么Java中任意对象可以作为锁的原因) 的持有权.当计数器为0则可以成功获取,获取后将锁计数器设为1也就是加

https://www.alwdzr.com

1。相应的在执行monitorexit 指令后,将锁计数器设为0,表明锁被释放。如果获取对象锁失败,那当前线程就要阻塞等待,直到锁被另外一个线程释放为止。

②synchronized修饰方法的的情况–同步方法

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mysql 有4种不同的索引

    主键索引(PRIMARY) 数据列不允许重复,不允许为NULL,一个表只能有一个主键 唯一索引(UNIQUE) 数据列不允许重复,允许为NULL值,一个表允许...

    用户7737280
  • 索引优化 最左前缀匹配原则

    索引是有序的,index1索引在索引文件中的排列是有序的,首先根据a来排序,然后才是根据b来排序,最后是根据c来排序,像select * from tab 这...

    用户7737280
  • 索引的数据结构:hash、二叉树、B树

    hash:使用存储在内存中的内容来创建表,而且数据全部存放在内存中。缺点:hash冲突–扰动函数 1.Hash存储需将所有的数据文件添加到内存中,比较浪费内存...

    用户7737280
  • 深入理解synchronized底层原理,一篇文章就够了!

    如果某一个资源被多个线程共享,为了避免因为资源抢占导致资源数据错乱,我们需要对线程进行同步,那么synchronized就是实现线程同步的关键字,可以说在并发控...

    beifengtz
  • 深入理解synchronized底层原理,一篇文章就够了!

    如果某一个资源被多个线程共享,为了避免因为资源抢占导致资源数据错乱,我们需要对线程进行同步,那么synchronized就是实现线程同步的关键字,可以说在并发控...

    挨踢小子部落阁
  • 并发编程原理剖析——并发编程的实现原理 顶

    如果想更深入了解对象头在JVM源码中的定义,需要关心几个文件,oop.hpp/markOop.hpp oop.hpp,每个 Java Object 在 JVM ...

    须臾之余
  • react 在使用数据请求的时候和setState的时候哪个先处理

    杭州前端工程师
  • JS实现图片弹窗效果

    中间磨磨唧唧从原生JS找到JS插件,浪费了不少精力和时间,但是也磕磕碰碰学到了些知识,建议读者:想学一下弹窗的JS实现代码的可以看看前两小节,只想实现效果的,直...

    浩Coding
  • 相克军_Oracle体系_随堂笔记015-网络原理及配置

    由于动态注册不稳定,采用静态注册方式,对应的listener.ora文件配置信息:

    Alfred Zhao
  • ubuntu 修改网卡名称 更改设备网卡名称 修改eno16777736为eth0 ubuntu 15.10网卡名称为eno16777736

    看到这个地方了没,有提示信息的,想要改变这个文件,记得运行 update-grub使之生效

    noteless

扫码关注云+社区

领取腾讯云代金券