锁
乐观锁CAS
AtomicInteger使用的Unsafe类的CAS操作解决了多线程之间访问的线程不安全问题,但仍然有CAS所具有的ABA问题,不过由于是数字类型的ABA问题也就不是问题了。
重入锁ReentrantLock
重入锁:指在同一线程中外部方法获得锁后内层递归方法依然可以获取该锁。如果锁不具备重入性,同一线程两次获取锁时会发生死锁。ReentrantLock基于AQS实现通过对tryAcquire和tryRelease方法的重写实现了锁机制和重入机制。
ReentrantLock处理重入性的逻辑:
- 判断state标量是否为0,为0说明没有现场持有锁,当前线程可以持有锁,返回true;
- state不为0判断当前线程是否为锁的持有者;
- 如果不是,那么当前线程不能持有锁,返回false;
- 如果是,那么当前线程已经持有锁,此时认为同线程的请求次数增加,state需要增加acquires次,acquires表示新增的请求锁次数。
ReentrantLock有两种实现方式:FairSync(公平锁)和NonfairSync(非公平锁)
FairSync:tryAcquire方法会严格按照入队顺序来处理等待线程;
NonfairSync:tryAcquire方法直接调用NonfairSync.nonfairTryAcquire()方法,该方法不严格按照等待队列的入队顺序获得锁。(无需保证有序,性能更好,也是ReentrantLock默认)
互斥锁
互斥锁Mutex Lock:通过阻塞线程来进行加锁,中断阻塞来进行解锁。
自旋锁
线程保持运行状态,用一个循环不停地判断某个标识量的状态来确定加锁还是解锁,本质上是用一段无意义的死循环来阻塞线程的运行。

浙公网安备 33010602011771号