该线程空间对象p1加锁:
-
该线程无锁对象
-
之前未对p1加过锁
—————————————————————————————————————————————————————
tls中data = NULL
*listp = NULL
cache中找不到加锁 —> 新建result(进行赋值操作threadCount = 1,nextData = *listp = NULL,object = p1) —> 解锁 tls中data = result, tls中data对应的lockCount = 1
—————————————————————————————————————————————————————
-
之前对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
—————————————————————————————————————————————————————
-
-
该线程有锁对象
-
之前未对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 ++
—————————————————————————————————————————————————————
-
之前对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
—————————————————————————————————————————————————————
-