Synchronized使用的各种案例

synchronized: 锁定对象(在堆内存中),不能用String常量,Long,Integer 等基本类型;即保证了原子性又保证了可见性

原理
hotspot实现: hotspot是这样实现的,在一个对象的头64位,拿出2位来记录这个对象是否被锁定,并存入线程ID(mark word)
hotsport实现步骤
1.第一次 markword 记录这个线程ID,没有其他线程访问 (偏向锁
2.线程争用 (自旋锁)-用户空间,会占用CPU
其他线程争用,首先是自旋(理解为while循环心跳检测,超过10次升级为重量级锁)
3.升级为 (重量级锁)- 内核空间,不会占用CPU
重量级锁会去操作系统申请锁资源,经过OS,进入等待队列,不再占用CPU
注意:
1.锁一旦升级了,就不能降级
2.执行时间长的,线程数多,用重量级锁(系统锁)
3.执行时间短的(加锁代码),线程数少,用自选锁

实例一、sycnchronized锁定某个对象

//hotspot是这样实现的,在一个对象的头64位,拿出2位来记录这个对象是否被锁定(mark word)
   private int count = 10;
    Object o = new Object();
    public static void main(String[] args) {
   

    }
    private void syncTest(){
   
       synchronized (o){
   //任何线程要执行以下代码,都必须先拿到锁
           count --;
       }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值