总结:Synchronized锁原理与用法

一、Synchronized底层原理

底层是通过Monitor实现的。每个java对象都有一个Monitor与之对应。

Monitor结构中有个owner字段,初始为null,当线程成功拥有该锁后,Monitor会在owner字段中保存线程唯一标识,表示该对象被此线程拥有了,即被锁住了。当锁被释放时又设置为NULL。

二、Monitor介绍

Monitor具体是怎么实现的?


1. Monitor是在jvm底层实现的,底层代码是c++
2.Monitor的enter方法:获取锁
3.Monitor的exit方法:释放锁
4.Monitor的wait方法:为java的Object的wait方法提供支持
5.Monitor的notify方法:为java的Object的notify方法提供支持
6.Monitor的notifyAll方法:为java的Object的notifyAll方法提供支持

Monitor的基本结构是什么?


1.Owner字段:初始时为NULL表示当前没有任何线程拥有该monitor record,当线程成功拥有该锁后保存线程唯一标识,当锁被释放时又设置为NULL
2.EntryQ字段:关联一个系统互斥锁(semaphore),阻塞所有试图锁住monitor record失败的线程
3.RcThis字段:表示blocked或waiting在该monitor record上的所有线程的个数
4.Nest字段:用来实现重入锁的计数
5.HashCode字段:保存从对象头拷贝过来的HashCode值(可能还包含GC age)
6.Candidate字段:用来避免不必要的阻塞或等待线程唤醒,因为每一次只有一个线程能够成功拥有锁,如果每次前一个释放锁的线程唤醒所有正在阻塞或等待的线程,会引起不必要的上下文切换(从阻塞到就绪然后因为竞争锁失败又被阻塞)从而导致性能严重下降;Candidate只有两种可能的值0表示没有需要唤醒的线程1表示要唤醒一个继任线程来竞争锁

参考链接:

https://blog.csdn.net/ignorewho/article/details/80854625

你可能感兴趣的:(java,多线程,并发编程,redis,android)