前言: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 导致遍历锁的时间增加,性能变差
四、源代码:参考他人
五、总结:其他人总结的不错