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

网站首页设计风格有哪些php网站开发数据列表排重

网站首页设计风格有哪些,php网站开发数据列表排重,网站建设_超速云建站,成都装修设计培训文章目录 1、管程2、AQS3、ReentrantLock3.1、lock/unlock3.1.1、lock3.1.2、unlock 3.2、一些思考 1、管程 什么是管程#xff1f; 管理协调多个线程对共享资源的访问#xff0c;是一种高级的同步机制。 有哪些管程模型#xff1f; hansen#xff1a;唤醒其他线程的代码… 文章目录 1、管程2、AQS3、ReentrantLock3.1、lock/unlock3.1.1、lock3.1.2、unlock 3.2、一些思考 1、管程 什么是管程 管理协调多个线程对共享资源的访问是一种高级的同步机制。 有哪些管程模型 hansen唤醒其他线程的代码必须在当前线程的最后执行以确保其他线程被唤醒时当前线程已经执行完。 hoare唤醒其他线程的代码可以在任意位置且唤醒其他线程后当前线程立即阻塞当被唤醒线程执行完后再继续执行当前线程。 mesa唤醒其他线程的代码可以在任意位置且被唤醒线程不会立即执行而是加入一个队列当当前线程执行完后再从队列中获取并执行其他线程。需要注意的是由于存在时间差所以真正执行的时候有可能已经不满足条件 其中最常用的管程模型就是mesa在java中实现的也是该模型。如下图是AQS的实现 其实管程模型在java里的实现不止有AQSsynchronized 在jvm的底层实现像什么 cxqentryListwaitSet也是mesa管程模型中的概念同理object.wait()/object.notify()也是管程模型的实现。 2、AQS 所以具体什么是aqs aqs就是java代码对管程模型的一个抽象实现。把volatile state字段定义成共享资源并且实现了同步等待队列和条件等待队列的入队/出队以及线程的阻塞/唤醒等公共操作至于具体共享资源的获取/释放则交由各自实现类不同的实现类可以定义不同的共享资源获取方式由此可以实现公平锁/非公平锁重入锁/不可重入锁独占锁/共享锁等以满足不同的场景。 简单的看个印象 共享资源 同步等待队列 条件等待队列 获取共享资源 释放共享资源 阻塞 唤醒 3、ReentrantLock AQS最经典的实现莫过于 ReentrantLock。接下来看看是 ReentrantLock 如何通过AQS实现 lock/unlock 的。 3.1、lock/unlock 3.1.1、lock AbstractQueuedSynchronizer.acquire 获取共享资源模板aqs实现 ReentrantLock .tryAcquire 共享资源获取逻辑即ReentrantLock 自己实现的获锁方法 在ReentrantLock中实现了公平/非公平两种获锁方式默认为非公平 以为非公平为例 ReservedStackAccessfinal boolean nonfairTryAcquire(int acquires) {final Thread current Thread.currentThread();int c getState();if (c 0) {//cas修改共享资源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.addWaiter 获锁失败后入队同步队列aqs实现 private Node addWaiter(Node mode) {Node node new Node(mode);for (;;) {Node oldTail tail;if (oldTail ! null) {//cas加入队列node.setPrevRelaxed(oldTail);if (compareAndSetTail(oldTail, node)) {oldTail.next node;return node;}} else {//初始化队列initializeSyncQueue();}}}AbstractQueuedSynchronizer.acquireQueued 入队后阻塞之前根据前节点的状态进行一定次数的自旋获锁aqs实现 final boolean acquireQueued(final Node node, int arg) {boolean interrupted false;try {//这个循环保证一定会获取到锁for (;;) {final Node p node.predecessor();//如果前一个节点是头结点再次尝试获锁if (p head tryAcquire(arg)) {//如果获锁成功就出队头结点setHead(node);p.next null;return interrupted;}//如果获锁失败或者前节点不是head的节点就根据前节点的状态来看是否需要阻塞//需要阻塞就调用 LockSupport.park() 阻塞线程if (shouldParkAfterFailedAcquire(p, node))interrupted | parkAndCheckInterrupt();}} catch (Throwable t) {cancelAcquire(node);if (interrupted)selfInterrupt();throw t;}}private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {int ws pred.waitStatus;//如果前驱节点状态为 SIGNAL 直接返回 true 阻塞线程if (ws Node.SIGNAL)return true;//如果前驱节点状态大于0说明线程已被返回剔除无用节点前驱节点if (ws 0) {do {node.prev pred pred.prev;} while (pred.waitStatus 0);pred.next node;} //cas替换前驱节点状态为 SIGNALelse {pred.compareAndSetWaitStatus(ws, Node.SIGNAL);}return false;}private final boolean parkAndCheckInterrupt() {LockSupport.park(this);return Thread.interrupted();}也就是说获锁失败进入同步等待队列进行阻塞而在实际阻塞之前会自旋再次尝试获锁。 实际上在自旋途中只有前节点是head的节点才会尝试获锁 如果前节点的 waitStatus 为 signal 则停止自旋 为避免无限自旋自旋的同时会尝试修改前节点的状态为 signal 3.1.2、unlock AbstractQueuedSynchronizer.release 释放共享资源模板aqs实现 h.waitStatus 0 说明后面没有等待唤醒的节点 ReentrantLock .tryRelease 共享资源释放逻辑即ReentrantLock 自己实现的释放锁方法 protected final boolean tryRelease(int releases) {int c getState() - releases;if (Thread.currentThread() ! getExclusiveOwnerThread())throw new IllegalMonitorStateException();boolean free false;if (c 0) {free true;setExclusiveOwnerThread(null);}//直接修改state值不需要cas或者什么操作因为释放锁不可能有并发setState(c);return free;}AbstractQueuedSynchronizer.unparkSuccessor 唤醒节点aqs实现 private void unparkSuccessor(Node node) {//清除node节点的waitStatus重置为0int ws node.waitStatus;if (ws 0)node.compareAndSetWaitStatus(ws, 0);//如果node节点的后继节点被取消或者为空就从尾部向前遍历找到实际的未取消后继节点。Node s node.next;if (s null || s.waitStatus 0) {s null;for (Node p tail; p ! node p ! null; p p.prev)if (p.waitStatus 0)s p;}//LockSupport.unparkif (s ! null)LockSupport.unpark(s.thread);}3.2、一些思考 1、公平锁和非公锁的区别在哪 2、如何实现可中断的 3、如何实现可超时的 4、一开始没有线程获取锁第一获取锁的线程进来直接获锁成功返回没有入队操作如何唤醒后继的线程 答虽然获锁线程没有入队但是如果后续有等待线程需要用到队列的话还是会new一个node用于表示之前获锁线程的相当于之前的获锁线程入队了。 5、被唤醒的节点如何出队
http://www.dnsts.com.cn/news/261676.html

相关文章:

  • 云抢购网官方网站北票网站建设
  • 发布网站需要备案吗长治建设工程交易网
  • 微网站建设微网站建设免费空间领取网站
  • 百度在线做网站seo数据是什么意思
  • 贵阳网站设计企业网站收费模板
  • 沈阳的网站制作公司哪家好查询建筑资质的网站
  • 东莞市企业网站制作平台栾城网站制作
  • 企业网站源码系统淘宝联盟手机网站建设
  • 厦门市湖里区建设局网站自发购卡网站在吗做
  • 效果好的网站建做任务领积分兑换别的网站上的会员
  • 网站风格包括哪些外贸那些网站好用
  • 自己怎样注册企业网站郑州it培训机构
  • 网站报价明细wordpress 运行环境
  • 商丘哪里做网站比较好做漫画的网站有哪些
  • 房地产建设项目网站学校网站建设发展概况分析
  • 西安电子科技大学信息化建设处网站招聘网站怎么做介绍
  • 中国建设教育网站官方中文wordpress搭建
  • 房子如何上网站做民宿长沙网站收录
  • 国外做美食视频网站有哪些遂宁市住房与城乡建设厅网站
  • 做商城网站报价怎样办一个网站
  • php网站建设视频教程江苏省建设厅官网
  • 首都农村医学人才培养体系建设与农村医学人才培养的研究与实践 网站公司邮箱一般是什么格式
  • 网站 开发 外包西安知名网站推广
  • 网站建设技术服务方案站外推广营销方案
  • 设计软件网站电商网站模板
  • 网站外围网站怎么做镇江seo网站优化
  • 长沙建网站公司建设银行观澜支行网站
  • 外贸网站公司wordpress 缩略图判断
  • 知乎网站内容建设的逻辑什么是网络社交
  • rp做网站原型要缩小尺寸吗企业安全文化宣传标语