weak 原理&&@synchronized 原理

前言:weak与synchronized相同点都是通过哈希表进行管理的,通过对传入的对象obj hash之后找到数组中某一个节点对象
 这个节点对象使用自旋锁保证操作节点对象线程安全
 weak 几个指向同一个对象的weak指针保存在同一个 weak_entry对象里面 -> 主要是获取weak指针变量的地址
 synchronized 不同的obj保存在不同的SyncData对面里面 -> 主要是获取递归锁

一、先上原理图:别用代码说明,别用文字说明,一大堆,绕死人,越说越晕,越看越晕

 二、 __weak id wp = p;
 几个重要的结构体概念:
 1、SideTableBuf:首先这是一个数组,然后对p对象hash之后,从数组中取得相应的SideTable对象
 2、SideTable:每一个对象被weak属性声明指针指向 都会存在一个SideTable
    2.1、spinlock 自旋锁,保证线程安全;
    2.2、主要用来判断 weak_table_t是否有值,是否有SIDE_TABLE_WEAKLY_REFERENCED 引用
    2.3、weak表 保存weak_entry实体
 3、Weak_table_t
     3.1、Weak_entry_t指针指向
     3.2、num_entries 初步估计被weak属性声明指针变量个数,为后来从Weak_entry_t取值方便(到底是取union中哪个结构体)
 4、Weak_entry_t
     4.1、referent 被指向对象的地址
     4.2、referrers当weak声明属性的cout大于4 则union使用当前变量
     4.3、默认使用inline_referrers count小于4

三、@syncronized原理:

 1、对传入的对象obj进行hash,之后在sDataLists数组中取出相应的SyncList对象 

 2、根据SyncData链表中的节点,找到与传入obj进行匹配,如果相等则取出相应的递归锁

 3、实际上通过递归锁进行加锁,解锁操作,如果过度使用@synchronize 导致遍历锁的时间增加,性能变差

四、源代码:参考他人

 

五、总结:其他人总结的不错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值