synchronized底层实现原理
对共享资源的争抢操作会导致线程安全问题,synchronized关键字可以使我们的类、方法、代码块以线程安全的方式执行。
也就是对于共享资源,同一时刻只能有一个线程对其进行操作,其他线程必须排队等着。
知其然不知其所以然,synchronized是如何做到线程安全的。
加锁。
锁又分为好多,悲观锁,乐观锁,synchronized属于悲观锁。
悲观锁,顾名思义,就是很悲观,总是认为别人会来抢夺资源,所以任何操作都会加锁,获取到锁的线程才能运行,获取不到锁的只能等到锁释放然后去抢夺(分公平锁和非公平锁)。
这些锁的概念完全可以根据字面意思来理解,怎么命名的就怎么理解。
在JVM虚拟机里有讲到,堆中生成的对象实例分为三个部分,对象头、实例数据、对其补充。
有关于锁的锁标志,锁状态,偏向锁,等等信息都存放在这个对象头里。
synchronized依托于对象头里的一个monitor对象。
这个monitor有两个原理,互斥以及协作。
当对象被一个线程持有,锁状态赋值为1,线程重新进入持有对象,这个值继续加1,所以synchronized是可重入锁。
释放锁,值减1,当值为0,多个线程可以争夺这把锁。