前言
java中锁的类型有多种多样,有自旋锁,悲观锁,独享锁,可重入锁,不可重入锁,公平锁和非公平锁等。这些锁的存在都是视图为当前线程争夺cpu资源而存在。其中,几种重要的锁的实现方式有:synchronized,ReentrantLock,ReentrantReadWriteLock等,今天我们来探讨其中一种,为什么synchronized是线程安全的。
对象在内存中的存储格式如下图所示:
java中每个对象都对应有一个监视器锁(Monitor),在jvm中,每个对象的存储都是有一定的存储格式,如下图所示:
在对象生成时,jvm就会制定出该对象在内存中的存储结构:
如果该对象被某个线程锁定,则通过修改jvm中对象存储结构上的某个字段信息来标记该对象已经被锁定,此时,锁进入,当该线程执行完成,锁退出。通过CAS(compare and swap)比对线程id,如果线程id一致则继续当前线程执行,如果不一致,则等待。当有多个线程争抢同一把锁时,则会进行锁的升级,形成由偏向锁–>轻量级锁–>重量级锁(Sync