synchronized原理

1、sync的用法
    1)access flag 方法
    2)代码段(字节码会不一样)    
        monitorenter
        monitorexit
    3)unsafe.monitorEnter(Object var1)
       unsafe.monitorExit(Object var1)
       Unsafe 不能直接用,需要反射才可以
2对象的内存结构:
    1)对象头区域:
        Mark World
            队形的C++类是哪个: markOopDesc
            32位机器占 4字节
            64位机器占 8字节
            底层 
            
        类型指针:基于哪个类生成的对象
        
    2)实例数据区域
        实例数据
    3)对齐填充区域
        对齐填充
        Padding
    
3,锁的类型:
    无锁
    匿名偏向
    偏向锁
    轻量级锁
    重量级锁
4 匿名偏向锁
    1)是什么
        偏向锁的初始化
        延迟偏向:4秒钟
        col-core
        maven
        
    2)对比偏向锁:mark world 中的值对比
        偏向锁
            101  thread_id = 线程id
        匿名偏向锁
            101  thread_id = null
        
    3)证明
        如果要模拟出偏向锁,需要延迟4秒以上
        
5 无锁->轻量级锁
    为什么:
        锁膨胀机制
            1)线程竞争
            2)不得不
                无锁时,执行到monitorEnter,如果偏向锁还没初始化,直接上轻量级锁 
    hashcode对锁的影响:
        不管是什么锁,如果加了hashcode,一定是重量级锁
            为什么:
                轻量级锁的重入时,BasicOjbect.header置为null
        重量级锁
6 轻量级锁的底层实现    

    锁撤销
        偏向锁->恢复成无锁状态->重量级锁
        轻量级锁->恢复成无锁状态->重量级锁

    1)实现的基础
        BasicOjbect
            owner  关联这个锁的对象指针
            header 存储无锁状态的Mark Word
                (1)为了恢复成无锁状态做准备
                (2)重入的标识
                    如果不是重入,存储的是无锁状态的Mark Word
                    如果是重入,置为null
                        
    2)存储在哪
        栈中 是方法对应的栈帧中,。如何证明:HSDB
        
        1,虚拟机栈中(线程栈中)
        2,方法对应的栈帧中
            

7 重量级锁底层实现
    底层实现是mutex
    重量级锁,性能不高
        因为:应用态 -->  内核态
            寄存器,环境的切换

8 park unpark 底层调用的是  pthread_mutex_lock pthread_mutex_unlock 
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值