加入收藏 | 设为首页 | 会员中心 | 我要投稿 新余站长网 (https://www.0790zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

面试多线程同步,你必须要思考的问题

发布时间:2019-08-01 09:54:54 所属栏目:评测 来源:佚名
导读:ReentrantLock的实现网上有很多文章了,本篇文章会简单介绍下其java层实现,重点放在分析竞争锁失败后如何阻塞线程。 因篇幅有限,synchronized的内容将会放到下篇文章。 Java Lock的实现 ReentrantLock是jdk中常用的锁实现,其实现逻辑主语基于AQS(juc包

park方法在os_linux.cpp中(其他操作系统的实现在os_xxx中)

  1. void Parker::park(bool isAbsolute, jlong time) { 
  2.  ... 
  3.  //获得当前线程 
  4.  Thread* thread = Thread::current(); 
  5.  assert(thread->is_Java_thread(), "Must be JavaThread"); 
  6.  JavaThread *jt = (JavaThread *)thread; 
  7.  //如果当前线程被设置了interrupted标记,则直接返回 
  8.  if (Thread::is_interrupted(thread, false)) { 
  9.  return; 
  10.  } 
  11.  if (time > 0) { 
  12.  //unpacktime中根据isAbsolute的值来填充absTime结构体,isAbsolute为true时,time代表绝对时间且单位是毫秒,否则time是相对时间且单位是纳秒 
  13.  //absTime.tvsec代表了对于时间的秒 
  14.  //absTime.tv_nsec代表对应时间的纳秒 
  15.  unpackTime(&absTime, isAbsolute, time); 
  16.  } 
  17.  //调用mutex trylock方法 
  18.  if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) { 
  19.  return; 
  20.  } 
  21.  //_counter是一个许可的数量,跟ReentrantLock里定义的许可变量基本都是一个原理。 unpack方法调用时会将_counter赋值为1。 
  22.  //_counter>0代表已经有人调用了unpark,所以不用阻塞 
  23.  int status ; 
  24.  if (_counter > 0) { // no wait needed 
  25.  _counter = 0; 
  26.  //释放mutex锁 
  27.  status = pthread_mutex_unlock(_mutex); 
  28.  return; 
  29.  } 
  30. //设置线程状态为CONDVAR_WAIT 
  31.  OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); 
  32.  ... 
  33.  //等待 
  34.  _cur_index = isAbsolute ? ABS_INDEX : REL_INDEX; 
  35.  pthread_cond_timedwait(&_cond[_cur_index], _mutex, &absTime); 
  36.  ... 
  37.  //释放mutex锁 
  38.  status = pthread_mutex_unlock(_mutex) ; 

(编辑:新余站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读