Sychronized底层原理总结

该线程空间对象p1加锁:

  1. 该线程无锁对象

    1. 之前未对p1加过锁
      —————————————————————————————————————————————————————
      tls中data = NULL
      *listp = NULL
      cache中找不到

       加锁 —> 新建result(进行赋值操作threadCount = 1,nextData = *listp = NULL,object = p1) —> 解锁
       tls中data = result, tls中data对应的lockCount = 1
      

      —————————————————————————————————————————————————————

    2. 之前对p1在其他线程已加过锁
      —————————————————————————————————————————————————————
      tls中data = NULL
      *listp = data(threadCount不定,nextData不定,object = p1)
      不可能在cache中(在获取syncData时就会先将其他线程中对该对象p1的加锁进行解锁)

       加锁 —> 在*listp中找到p1的data 为result(进行threadCount ++操作) —> 解锁
       该tls中data = result,tls中data对应的lockCount = 1
      

      —————————————————————————————————————————————————————

  2. 该线程有锁对象

    1. 之前未对p1加过锁
      —————————————————————————————————————————————————————
      tls中data 肯定存在,但data的object一定不为p1
      *listp不一定,但链表中一定不存在p1对象的data
      cache中找不到

       加锁 —> 新建result(threadCount = 1,nextData = *listp,object = p1) —> 解锁
       缓存list中cache->used处的data = result, 缓存list中cache->used处data对应的lockCount = 1,cache->used ++
      

      —————————————————————————————————————————————————————

    2. 之前对p1在其他线程已加过锁
      —————————————————————————————————————————————————————
      tls中data存在,data的object不一定为p1
      为p1:进行lockCount ++操作
      不为p1:
      该线程第一次对p1加锁:不存在cache中,只有listp中有p1对象的data
      加锁 —> 在
      listp中找到p1的data 为result(进行threadCount ++操作) —> 解锁
      缓存list中cache->used处的data = result, 缓存list中cache->used处data对应的lockCount = 1,cache->used ++
      该线程已多次次对p1加锁:存在cache中,*listp中也有p1对象的data
      在缓存中找到p1对象对应的data,进行lockCount ++操作

       *listp不定,但链表中一定存在p1对象的data
      

      —————————————————————————————————————————————————————

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容