当前位置: 首页 > wzjs >正文

用dede做的网站一级建造师价格最新行情

用dede做的网站,一级建造师价格最新行情,产业互联网平台,网站转app工具高级版以 ReentrantLock#lock() 的非公平锁实现为例 结论:节点在加入等待队列后会进行两次自旋,获取不到锁后线程挂起,等待前驱节点唤醒。 此外,AQS 在节点加入队列前也会多次尝试获取资源,通过以上方式,在高并…

以 ReentrantLock#lock() 的非公平锁实现为例

结论:节点在加入等待队列后会进行两次自旋,获取不到锁后线程挂起,等待前驱节点唤醒

此外,AQS 在节点加入队列前也会多次尝试获取资源,通过以上方式,在高并发场景中很好的平衡了 长时间自旋的开销 和 线程阻塞的性能损耗(频繁的上下文切换)

核心代码:

// AbstractQueuedSynchronizer
// 线程直接获取资源失败,加入等待队列,通过自旋 + 阻塞获取锁
final boolean acquireQueued(final Node node, int arg) {boolean failed = true;try {boolean interrupted = false;// 自旋操作,for 循环中并没有明确的自旋次数,答案藏在 shouldParkAfterFailedAcquire() 中for (;;) {final Node p = node.predecessor();// 检查是否能获取资源if (p == head && tryAcquire(arg)) {setHead(node);p.next = null; // help GCfailed = false;return interrupted;}// 检查是否需要阻塞if (shouldParkAfterFailedAcquire(p, node) &&parkAndCheckInterrupt())interrupted = true;}} finally {if (failed)cancelAcquire(node);}
}// AbstractQueuedSynchronizer
// 检查线程是否需要阻塞
private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {int ws = pred.waitStatus;// SIGNAL 状态表明应该阻塞if (ws == Node.SIGNAL)return true;// 对应的节点状态是 CANCELLED,直接跳过if (ws > 0) {do {node.prev = pred = pred.prev;} while (pred.waitStatus > 0);pred.next = node;} else {// 剩余的情况都会将前驱节点的状态置为 SIGNAL// 这样在下一次自旋时就会返回 true,进入阻塞,也就是自旋两次的由来compareAndSetWaitStatus(pred, ws, Node.SIGNAL);}return false;
}

完整加锁链路:

// ReentrantLock
public void lock() {sync.lock();
}// ReentrantLock#Sync
abstract void lock();// ReentrantLock#NonfairSync
final void lock() {// 资源空闲时直接获取if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());else// 资源被占用时acquire(1);
}// AbstractQueuedSynchronizer
public final void acquire(int arg) {if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();
}// ReentrantLock#NonfairSync
protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires);
}// ReentrantLock#Sync
// 该方法做了两件事情:资源空闲时获取资源、当前线程重入获取资源(ReentrantLock 是可重入锁)
final boolean nonfairTryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();if (c == 0) {if (compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}}else if (current == getExclusiveOwnerThread()) {int nextc = c + acquires;if (nextc < 0) // overflowthrow new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;
}// AbstractQueuedSynchronizer
// 线程直接获取资源失败,加入等待队列,通过自旋 + 阻塞获取锁
final boolean acquireQueued(final Node node, int arg) {boolean failed = true;try {boolean interrupted = false;// 自旋操作,for 循环中并没有明确的自旋次数,答案藏在 shouldParkAfterFailedAcquire() 中for (;;) {final Node p = node.predecessor();// 检查是否能获取资源if (p == head && tryAcquire(arg)) {setHead(node);p.next = null; // help GCfailed = false;return interrupted;}// 检查是否需要阻塞if (shouldParkAfterFailedAcquire(p, node) &&parkAndCheckInterrupt())interrupted = true;}} finally {if (failed)cancelAcquire(node);}
}// AbstractQueuedSynchronizer
// 检查线程是否需要阻塞
private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {int ws = pred.waitStatus;// SIGNAL 状态表明应该阻塞if (ws == Node.SIGNAL)return true;// 对应的节点状态是 CANCELLED,直接跳过if (ws > 0) {do {node.prev = pred = pred.prev;} while (pred.waitStatus > 0);pred.next = node;} else {// 剩余的情况都会将前驱节点的状态置为 SIGNAL// 这样在下一次自旋时就会返回 true,进入阻塞,也就是自旋两次的由来compareAndSetWaitStatus(pred, ws, Node.SIGNAL);}return false;
}


文章转载自:

http://VRKGiWhL.pLjxz.cn
http://7Ep8iibq.pLjxz.cn
http://7VkXkuMo.pLjxz.cn
http://Kg2xhYNx.pLjxz.cn
http://aLCAgFwM.pLjxz.cn
http://bt599K1F.pLjxz.cn
http://oTPYLfNs.pLjxz.cn
http://Yw2oRPid.pLjxz.cn
http://UcQU47S3.pLjxz.cn
http://bJOLX5H5.pLjxz.cn
http://gIzs1cWW.pLjxz.cn
http://FJZC3Up1.pLjxz.cn
http://s8uKJJJh.pLjxz.cn
http://8cobiERj.pLjxz.cn
http://hMkHmJJY.pLjxz.cn
http://nSQNl7mE.pLjxz.cn
http://NN2n91is.pLjxz.cn
http://KVtbWjnT.pLjxz.cn
http://UzVzKsFr.pLjxz.cn
http://zcEknYS2.pLjxz.cn
http://eOThjWLP.pLjxz.cn
http://MpXnBD5K.pLjxz.cn
http://yadm4Otv.pLjxz.cn
http://1J3xPwRx.pLjxz.cn
http://ZoN0ykIl.pLjxz.cn
http://SQYlia9o.pLjxz.cn
http://5ubEg4BY.pLjxz.cn
http://2t1VhidM.pLjxz.cn
http://XoiAYlxH.pLjxz.cn
http://NVeGmz7n.pLjxz.cn
http://www.dtcms.com/wzjs/660599.html

相关文章:

  • 网站赢利招商网站建设定做
  • 专门做金融的招聘网站什么是网络营销含义
  • 怎么重启网站服务器dw主页制作
  • 提供网站哪家好教务管理系统学生登录入口
  • 游戏设计师网站网站建设的大功效
  • 制作企业网站页面htmlwordpress相册管理系统
  • 网站做的最好的动画制作软件免费版
  • 香河县住房和城乡建设部网站设计ui是什么意思
  • 专业制作彩铃网站企业文化墙创意设计图
  • 夜间正能量网站入口免费下载h5用什么网站来做
  • 集团公司做网站烟台做网站谁家好
  • 网站主题切换甜蜜定制app
  • 哪个网站做招聘海报比较好wordpress 获取所有菜单
  • 网站的商桥怎么做门户网站模板下载
  • 58同城类似的网站开发济南优化网络营销
  • 重庆制作网站培训机构西樵网站制作
  • 常州建设局建筑职称网站wordpress 更换数据库
  • 工业皮带怎么做免费的网站企业网站建设人员分析
  • 泉州住房与城乡建设网站网站安全防护措施
  • 代码需求网站网站是自己做还是让别人仿
  • 源码屋整站源码如何更好的建设和维护网站
  • 高密网站制作手机自己制作app软件
  • 网站建设都是用什么软件如何做网站本地服务器
  • 网站建站加盟单页网站的营销
  • 珠宝玉器监测网站建设方案让wordpress的页面有具体的地址
  • 西安seo网站公司找建设项目的网站
  • wordpress修改链接南宁seo怎么做优化团队
  • 绍兴手机网站建设东莞市智通人才市场最新招聘信息
  • 家政月嫂网站源码中国互联网排名前十的公司
  • 赤峰市做网站多少钱企业网站管理系统 免费