美文网首页
Sychronized底层原理总结

Sychronized底层原理总结

作者: YY323 | 来源:发表于2023-08-14 17:34 被阅读0次

该线程空间对象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
      

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

相关文章

网友评论

      本文标题:Sychronized底层原理总结

      本文链接:https://www.haomeiwen.com/subject/tlscmdtx.html