基础知识:多线程同时访问一个共享数据,synchronized、cas、concurrentHashMap、lock等。
多个线程过来,都尝试对同一个lock对象进行加锁
ReentrantLock lock = new ReentrantLock ();
Lock.lock();
// 业务代码
Lock.unlock();
AQS的原理图:
ReentrantLock 默认是非公平锁,要想变为公平锁,则需要初始化的时候传入参数true。(唤醒的时候如果这个时候线程3强制执行cas且执行成功了,那么等待队列中的线程2还是要继续等待,所以这个时候是非公平的)