先说结论,因为使用synchronized的线程,每一个线程都有一把锁,根据下图大概解释下:
image.png
thredcount:当前多少线程有加锁,每多一个加锁(不管加了几次锁)thredcount只会加1,当单个线程全部解锁后减1
lockcount:单个线程目前被加了几次锁,每多加一次锁,lockcount加1。当lockcount为0时,thredcount减1
TLS:系统会为每个线程分配一个缓存区域,在synchronized中,如果已经加过锁,则此缓存中就会存在此锁信息
syncCahcheitem:快速缓存区域,当此线程有synchronized锁对象的时候,此快速缓存中就会存在,下次在加入时优先从快速缓存中查找。如果没有则会走objc_pthresd_data
objc_pthresd_data:所有的锁信息都会在此进行存储,当快速缓存中没有查找到对应锁时,就会来此查找,找到对锁进行设置,并同步到快速缓存中
网友评论