StampedLock:一个并发编程中非常重要的票据锁( 三 )

运行上面的程序 , 会导致thread02线程所在的CPU飙升到100% 。
这里 , 有很多小伙伴不太明白为啥LockSupport.park();会导致thread01会永远阻塞 。这里 , 冰河为你画了一张线程的生命周期图 , 如下所示 。

StampedLock:一个并发编程中非常重要的票据锁

文章插图
这下明白了吧?在线程的生命周期中 , 有几个重要的状态需要说明一下 。
  • NEW:初始状态 , 线程被构建 , 但是还没有调用start()方法 。
  • RUNNABLE:可运行状态 , 可运行状态可以包括:运行中状态和就绪状态 。
  • BLOCKED:阻塞状态 , 处于这个状态的线程需要等待其他线程释放锁或者等待进入synchronized 。
  • WAITING:表示等待状态 , 处于该状态的线程需要等待其他线程对其进行通知或中断等操作 , 进而进入下一个状态 。
  • TIME_WAITING:超时等待状态 。可以在一定的时间自行返回 。
  • TERMINATED:终止状态 , 当前线程执行完毕 。
看完这个线程的生命周期图 , 知道为啥调用LockSupport.park();会使thread02阻塞了吧?
所以 , 在使用StampedLock时 , 一定要注意避免线程所在的CPU飙升的问题 。那如何避免呢?
那就是使用StampedLock的readLock()方法或者读锁和使用writeLock()方法获取写锁时 , 一定不要调用线程的中断方法来中断线程 , 如果不可避免的要中断线程的话 , 一定要用StampedLock的readLockInterruptibly()方法获取可中断的读锁和使用StampedLock的writeLockInterruptibly()方法获取可中断的悲观写锁 。
最后 , 对于StampedLock的使用 , JDK官方给出的StampedLock示例本身就是一个最佳实践了 , 小伙伴们可以多看看JDK官方给出的StampedLock示例 , 多多体会下StampedLock的使用方式和背后原理与核心思想 。
点击关注 , 第一时间了解华为云新鲜技术~
【StampedLock:一个并发编程中非常重要的票据锁】

经验总结扩展阅读