非常吊的一篇文章,让你瞬间理解锁的定义:
https://blog.csdn.net/chenssy/article/details/54883355
synchronize锁:
锁有两个中重要东西:Monitor 对象头【或者叫Markword +class pointer】
Monitor: 其实就是一个对象,可以说当遇到synchronize的就能自动生成这样一个对象,与需要加锁代码(synchronized(this){})的对象进行关联,这里关联的对象就是this所指的对象。【描述的不太确切,但是是个意思】;
Markword: 对象头里面的重要信息,记录了对象的hashcode, Gc年龄,是否偏向锁,锁的状态
Klass Point:是是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
Monitor会做的重要事情:
记录threadID-----,这个是锁冲入的一个重要因素,这个是根据线程来的;
对象的hashcode---保存从对象头拷贝过来的HashCode值(可能还包含GC age)---用来判断是新来的线程对象,是否与锁定的对象一致,若一直,就能进行操作,若不一致,则锁就开始升级