java多线程中LockSupport.pack和LockSupport.unpack的用法与原理

110 阅读1分钟

LockSupport.pack这个方法会阻塞线程,但是线程不会释放所持有的锁对象。

原理部分叙述如下

在每一个线程中都会有一个Parker对象,在该对象中会包含一个_counter字段以及一个_cond字段。 本文在以下场景中解释相应原理

  • 在线程运行过程中调用LockSupport.park方法 初始_counter = 0; 在调用该方法以后 判断_counter是否为0,如果是0,该线程就会进入到_cond内部,进入阻塞状态,同时将_counter设置为0.
  • 如果线程已经执行了LockSupport.park方法,调用unpark,调用后,会将_count数值设置为1,并且将线程唤醒,同时将_count设置为0.
  • 如果先执行了LockSupport.unPark方法,后执行LockSupport.park方法,在执行unPark方法时会将_counter设置为1,此后执行park,因为_counter为1,因此不会阻塞,此后将这个字段设置为0.因此再次调unPark方法的时候,会想第一种情况一样进行阻塞