原理:每个对象有一个监视锁monitor,当monitor被占用时对象就处于被锁定状态
线程执行monitorenter指令时常识获取monitor的所有权:当monitor的进入数为0时,表示该对象可被占用,当有进程获取到
该对象时monitor进入数+1,当执行monitorexit的线程退出时进入数减1。
都是基于CAS技术实现锁机制。都是试图在用户态就把锁问题解决,避免进入内核态的线程阻塞
reentrantLock的实现其实是一种自旋锁,通过循环调用CAS操作来实现加锁。
锁的实现区别:
1、简单的说synchronized是基于JVM实现的,reentrantLock是基于JDK实现的。类似于操作系统实现和自己代码实现。
synchronized是基于编译器保证锁的加锁和释放锁,但reentrantLock是需要手工声明
2、ReentrantLock灵活性高,可以指定公平锁还是使用非公平锁。而synchronized是非公平锁
3、ReentrantLock可以通过Condition来指定唤醒对应的线程,但synchronized唤醒类似于notifyAll()