Java LockSupport.park& LockSupport.unpack 为什么可以先unpark原理解析(图解,生动形象例子解释)

在这里插入图片描述

  • 每个线程都有自己的一个Park对象,由三个部分组成_count,_cond,和_mux打个比喻
    • 线程就像是一个程序员(这个程序员,有烟才会敲代码,没烟就睡觉)
    • _cond是程序员睡觉的地方(没有烟,程序员就不敲代码了,就会跑这里睡觉)
    • _counter是烟存放的地方(0表示没有烟了,1表示有烟)
    • _mutex 互斥锁
  • 现在列举不同状态这些变量的变化以及线程的运行状态
    • 正常线程没有执行过unpark(此时_counter=0,程序员嘴里叼着烟),park方法执行后,程序员会立刻将烟吸完然后去睡觉。
    • park堵塞中的线程(睡眠中的程序员),执行unpark之后,_counter设置为1,然后程序员醒来把新来的烟叼在嘴里继续工作(_counter设置0)
    • 正在抽烟敲代码的程序员(正常运行中的线程),执行unpark方法后,_counter设置为1,之后如果再执行park,程序员会立刻将手中的烟抽掉【程序员想休息了】,接着程序员发现_counter=1,然后拿着新烟(_counter设置为0)【程序员很无奈】,继续敲代码。
  • 通过上面三种状态大家应该能更深层次从原理上知道为什么可以提前unpark了把。(unpark提前多次不能重叠,与提前一次unpark结果一样)

一起变强吧。

猜你喜欢

转载自blog.csdn.net/qq_20156289/article/details/108097454