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

pc门户网站是什么意思外贸网站搭建推广

pc门户网站是什么意思,外贸网站搭建推广,潍坊网站设计,湖州建设网站一、Condition 在并发情况下进行线程间的协调#xff0c;如果是使用的 synchronized 锁#xff0c;我们可以使用 wait/notify 进行唤醒#xff0c;如果是使用的 Lock 锁的方式#xff0c;则可以使用 Condition 进行针对性的阻塞和唤醒#xff0c;相较于 wait/notify 使用…一、Condition 在并发情况下进行线程间的协调如果是使用的 synchronized 锁我们可以使用 wait/notify 进行唤醒如果是使用的 Lock 锁的方式则可以使用 Condition 进行针对性的阻塞和唤醒相较于 wait/notify 使用起来更灵活。那 Condition 是如何实现线程的等待和唤醒的呢本篇文章带领大家一起解读下 Condition 的源码。 在进行源码分析前先回顾下 Condition 是如何使用的例如下面一个案例 public class Test {public synchronized static void main(String[] args) throws InterruptedException {Lock lock new ReentrantLock();Condition condition lock.newCondition();new Thread(() - {lock.lock();System.out.println(线程1开始等待);try {condition.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(线程1被唤醒继续执行结束);lock.unlock();}, 1).start();new Thread(() - {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}lock.lock();System.out.println(开始唤醒线程);condition.signal();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(线程2执行结束);lock.unlock();}, 2).start();} }运行之后可以看到下面日志 由于在第一个线程中使用的 condition.await() 因此当前线程会被阻塞挂起而第二个线程在 1s 后进行了 condition.signal() 操作因此第一个线程会被唤醒继续执行。这里细心的小伙伴应该可以发现第一个线程阻塞时锁并没有释放而第二个线程在1s后也成功拿到锁了所以表明在 condition.await() 时会自动释放当前锁这点和 wait 相同在第二个线程进行了 condition.signal() 操作第一个线程并没有继续向下执行而是等待第二个线程处理完才会继续执行由此可以表明被唤醒的线程会重新获取锁成功获取锁后继续执行。 下面通过源码看下 Condition 是如何实现的等待唤醒。 二、Condition 源码解读 2.1. lock.newCondition() 获取 Condition 对象 首先看下在使用 lock.newCondition() 获取一个Condition 对象时具体做了什么这里以 ReentrantLock 为例进入到 ReentrantLock 的 newCondition() 方法中又执行了 Sync 的 newCondition() 方法再进去就会发现其实是 new 了一个 ConditionObject 类对象 下面点到这个类中可以看到其实是 AbstractQueuedSynchronizer 下的一个子类 2.2. condition.await() 阻塞过程 了解到 Condition 的对象后下面就可以看下 condition.await() 方法了点到该类下的 await() 方法中 其中 addConditionWaiter() 则是将自己加入到链表中并获取到当前线程所在的 Node 这里注意下 Node 的状态是 Node.CONDITION 也就是 -2后面会依赖于该状态。 下面再回到 await() 方法继续向下看接着使用了 fullyRelease 方法传入了当前的 Node 这里的 fullyRelease 方法主要做了释放当前线程锁的操作。 点到 release 方法中主要执行了 unparkSuccessor 如果看过 Lock 锁的解锁源码就会知道其实 unparkSuccessor 就是解锁的过程 下面继续回到 await() 方法中当释放锁后进入到了一个 while 循环中通过查看 isOnSyncQueue 方法可以看到是可以符合while的条件也就可以进入到循环中 在循环中可以明显的看到 LockSupport.park(this) 将当前线程进行了阻塞。 2.3. condition.signal() 唤醒过程 上面已经看到线程被阻塞了如果需要被唤醒则需要通过condition.signal()这个方法是如何唤醒的呢 下面来到 AbstractQueuedSynchronizer 类的 signal() 方法中 主要执行了 doSignal 方法再点到 doSignal 中可以看到这里开启了一个循环对链表的每一个元素都进行了 transferForSignal 操作这里也比较好理解就是要唤醒等待中的线程。 下面点到 transferForSignal 中看下对每个 Node 都做了什么操作。点进去之后也比较好理解如果状态是 Node.CONDITION 也就是 -2刚才在解读 await 方法时就提到这个状态了这里正好形成了呼应下面有个非常显眼的操作 LockSupport.unpark(node.thread) 直接唤醒了目标线程。也就是唤醒了 2.2 中的最后一步操作。 2.4. condition.await() 被唤醒后 当 await() 方法中的 LockSupport.park(this) 被唤醒后继续向下执行下面会判断下当前线程有没有被打断如果没被打断则 break 终止循环继续执行。 下面这个 acquireQueued 方法如果看过 Lock 加锁的源码应该可以了解到就是上锁的过程 成功获取锁后就会继续执行被阻塞的线程也就是继续执行。 三、总结 通过上面的源码分析应该对 Condition 有了新的理解和掌握细心地小伙伴应该可以发现在源码中好多地方都使用了 CAS 因此当竞争资源非常激烈时 Lock 的性能要远远优于 synchronized。
http://www.w-s-a.com/news/466913/

相关文章:

  • php投资理财企业网站模板网站呼叫中心 建设工期
  • 查数据的权威网站silverlight 做的网站
  • 网站开发外包网站贵阳网站建设 网站制作
  • 官方微网站西安景观设计公司排行
  • 广州学做网站视频代做网站
  • 沈阳公司建站seo课程培训班
  • 杭州做微信网站软件公司网站建设毕业设计中期进度报告
  • 怎么做谷歌这样的网站如何建立一个网站放视频
  • 园区网站建设调研报告北京朝阳区哪里有网站开发
  • 网站角色权限wordpress 优化版
  • 购物网站ppt怎么做网络公司注册多少钱
  • 学做衣服上什么网站好贴吧高级搜索
  • 贵州 跨境电商网站建设做淘宝店铺有哪些好的网站
  • 广州正规网站制作公司网站搭建公司
  • ui设计零基础好学吗珠海网站建设优化推广
  • 网站开发多少费用火车头采集wordpress发布时间
  • 有没有做皮艺的网站教育培训网站建设ppt
  • 建设外贸商城网站制作如何建设景区旅游网站
  • 网站建设服务的具体条件怎么建设一个响应式网站
  • 做flash的网站wordpress设置前台投稿
  • 商务网站开发文档迅雷资源做下载网站
  • 无极磁铁网站如何把地图放到自己做的网站上
  • 青浦赵巷网站建设公司网站开发需求文档
  • 苏州网站建设的公司哪家好无锡网站制作那些
  • 装饰公司网站模板科技成果鉴定机构
  • 给公司做的东西放到私人网站上十堰为企业做网站的单位
  • 手机网站建设价钱手机自己做网站
  • 网站建设属于哪种公司电子商务查询网站
  • 工程建设标准强制性条文最新版本网站关键词排名优化应该怎么做
  • 网站网页设计内容品牌高端网站建设公司