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

模块建站平台国外wordpress

模块建站平台,国外wordpress,小程序开发定制制,咨询公司管理制度前言 ​ 多线程并发场景中#xff0c;时常需要线程协同#xff0c;故而需要对当前线程进行阻塞#xff0c;并唤醒需要协同的线程来一起完成任务。 ​ 通常处理方式有三种#xff1a; 1#xff09;Synchronized加锁的线程 使用Object类下所提供的方法#xff1a; wai…前言 ​ 多线程并发场景中时常需要线程协同故而需要对当前线程进行阻塞并唤醒需要协同的线程来一起完成任务。 ​ 通常处理方式有三种 1Synchronized加锁的线程 使用Object类下所提供的方法 wait()让当前线程处于等待状态并释放当前拥有的锁notify()随机唤醒等待该锁的其他线程重新获取锁并执行后续的流程只能唤醒一个线程notifyAll()唤醒所有等待该锁的线程锁只有一把虽然所有线程被唤醒但所有线程需要排队执行 2Lock加锁的线程 Condition 类下的锁提供的方法 await()对应 Object 的 wait() 方法线程等待signal()对应 Object 的 notify() 方法随机唤醒一个线程signalAll()对应 Object 的 notifyAll() 方法唤醒所有线程。 3以上两种加锁的场景 使用JUC中LockSupport阻塞工具类的方法 LockSupport.park()休眠当前线程。LockSupport.unpark(线程对象)唤醒某一个指定的线程。 概述 ​ LockSupport来自于JDK1.5位于JUC包的locks子包是一个非常方便实用的线程阻塞工具类它定义了一组的公共静态方法这些方法提供了最基本的线程阻塞和唤醒功能可以在线程内任意位置让线程阻塞、唤醒。 ​ 在AQS框架的源码中当需要阻塞或唤醒一个线程的时候都会使用LockSupport工具来完成。LockSupport 和 CAS 是Java并发包中并发工具锁和其他同步类控制机制的实现基础而这两个基础其实又是依赖Unsafe类然而Unsafe只是维护了一系列本地方法接口因此真正的实现是在HotSpot的源码中而HotSpot是采用C来实现的 ​ AQS框架是JUC中实现同步组件的基石而LockSupport可以说是AQS框架的基石之一。 LockSupport的特征和原理 特征 1、LockSupport是非重入的。因为调用一次park方法线程就被阻塞了。 **2、LockSupport的park阻塞、unpark唤醒的调用不需要任何条件对象也而不需要先获取什么锁。**也就是说LockSupport只与线程绑定就可以降低代码耦合性。 **3、park阻塞与unpark唤醒的调用顺序可以颠倒不会出现死锁并且可以重复多次调用unpark。**但是ThreadGroup类的stop和resume方法如果顺序反了就会出现死锁现象。 **4、park支持中断唤醒但是不会抛出InterruptedException异常。**意思就是使用Thread.interrupted() 可以使线程中断会使park失效。 原理 ​ 每个线程都与一个许可(permit)关联。unpark函数为线程提供permit线程调用park函数则等待并消耗permit。permit默认是0调用一次unpark就变成1再调用一次park会消费permit也就是将1变成0park会立即返回。 ​ 如果原来没有permit那么调用park会将相关线程阻塞在调用处等待一个permit这时调用unpark又会把permit置为1使得阻塞的线程被唤醒。每个线程都有自己的permit但是permit最多持有一个重复调用unpark也不会积累。 ​ LockSupport.park和LockSupport.unpark不会引发的死锁问题因为由于许可的存在即使unpark发生在park之前也可以使得下一次的park操作立即返回。 ​ 和Object.wait相比LockSupport.park不需要先获得某个对象的锁也不会抛出InterruptedException 异常。 ​ 和synchronized相比LockSupport.park()阻塞的线程可以被中断阻塞但是不会抛出异常并且中断之后不会清除中断标志位。被park阻塞的线程处于WAITING状态超时park阻塞的线程则处于TIMED_WAITING状态。 LockSupport的方法解析 ​ LockSupport定义了一组以park开头的方法用来阻塞当前线程以及unpark方法来唤醒一个被阻塞的线程。 park ​ 除非许可证permit可用否则出于线程调度目的禁用当前线程。 如果许可证可用则该许可证被消耗呼叫立即返回否则出于线程调度目的当前线程将被禁用并处于休眠状态直到发生以下三种情况之一 其他线程以当前线程为目标调用 unpark或其他线程中断当前线程或呼叫错误地即没有原因地返回。 ​ 此方法不报告导致方法返回的原因。调用方应首先重新检查导致线程停止的条件。调用方还可以在返回时确定线程的中断状态。 unpark ​ 使给定线程的许可证permit可用如果尚未可用。如果线程在 park上被阻塞那么它将解除阻塞。否则它对 park 的下一次呼叫保证不会被阻塞。如果给定的线程尚未启动则不能保证此操作有任何效果。 源码分析 ​ 在 LockSupport.park()的底层主要是调用 Unsafa 类的 park方法每个线程对象都有一个 Parker 实例这个实例内部有提供park和unpark方法。 Unsafe类 ​ Unsafe这个类中有许多的native方法通过字段偏移量类似于C的指针提供了Java语言与底层系统进行交互的接口通过Unsafe可以直接操作底层系统它具有直接内存管理、线程阻塞唤醒的支持、CAS操作的支持、直接操作类、对象、变量等强大的功能。 JavaThread ​ JavaThread内部具有一个threadOb属性这个属性实际上就是保存这着Java层面的一个Thread对象而JavaThread继承了Thread继承了_osthread字段。那么一个JavaThread对象和一个OSThread对象对应同时又和一个Thread对象对应这样它们三个的就被联系起来了。因此实际上一个Java的Thread对应着一个OS线程。 ​ Unsafe可以直接操作JVM和底层系统因此可以通过Thread是直接找到JavaThread实例进行操作因此即使我们在Thread中没有找到“permit”但是这个“permit”肯定是在Hotspot的源码中能就见到 ​ JavaThread内部还有一个Parker类型的_parker属性这个Parker实际上就是用来实现Java中的LockSupport 的park 和unpark的即实现单个线程的阻塞和唤醒也就是JUC的中线程阻塞、唤醒在JVM层面的实现。 ​ Parker有一个_counter字段这个字段实际上就是我们常说的“许可”并且默认初始化为0。我们调用的park、unpark方法实际上是调用的Parker的同名方法。 PlatformParker ​ Parker源码中表示Parker继承了PlatformParker由于Hotspot虚拟机为跨平台针对不同操作系统有不同的实现最常见的就是linux系统以此来分析。 ​ PlatformParker内部具有POSIX库标准的互斥量(锁)mutex和条件变量condition那么实际上Parker的对于park和unpark的实现实际上就是用这两个工具实现的。 ​ 另外PlatformParker还有一个cur_index属性它的值为-1、0或者1-1时初始化的值调用park并返回的线程也会设置值为-1。如果不是-1那么表示对应的parker中的条件变量上有线程被挂起_cur_index等于0表示调用park相对时间的线程在第一个条件变量上被挂起等于1则表示调用park绝对时间的线程在第二个条件变量上被挂起。 mutex与condition概述 ​ 实际上mutex与condition都是posix标准的用于底层系统线程实现线程同步的工具。 mutex被称为互斥量锁类似于Java的锁即用来保证线程安全一次只有一个线程能够获取到互斥量mutex获取不到的线程则可能会阻塞。而这个condition可以类比于java的Condition被称为条件变量用于将不满足条件的线程挂起在指定的条件变量上而当条件满足的时候再唤醒对应的线程让其执行。 ​ 可以理解为mutex与condition来实现加锁、释放锁。如同synchronized与监视器对象一样。 Parker 和 Synchronized的ParkEvent 的区别 ​ ParkEvent是用于Java级别的Synchronized关键字Parker是JSR166来的并发工具集合,后面会统一使用ParkEvent。ParkerEvent 继承了PlatformEvent基类PlatformEvent是特定于平台的而ParkEvent则是平台无关的。而Parker 继承自PlatformParker。 ParkerEvent中的parkunpark方法用于实现Java的object.wait()方法和object.notify()方法;Parker中的parkunpark方法用于实现Java的Locksupprt.park()方法和Locksupprt.unpark()方法; park 方法源码分析 执行过程 1、判断是否需要阻塞等待如果已经是 _counter 0, 不需要等待将 _counter 0 返回 2、如果 1 不成立构造当前线程的 ThreadBlockInVM 检查 _counter 0 是否成立成立则将 _counter 设置为 0 unlock mutex 返回 3、如果 2 不成立更具需要时间进行不同的函数等待如果等待正确返回则将 _counter 设置为0 unlock mutex park 调用成功。 parker 类的定义如下 Parker 类继承 os::PlatformParker。有一个 _counter 属性可以理解为是否可以调用 park 方法的许可证只有 _count 0 的时候才能调用提供了公开的 park 和 unpark 方法 unpark 方法源码分析 执行过程 pthread_mutex_lock 获取锁_counter 设置为 1判断 _counter 的旧值 小于 1 时调用 pthread_cond_signal 唤醒在 park 阻塞的线程等于 1 时直接返回 总结 ​ LockSupport是JDK1.5时提供的用于实现单个线程等待、唤醒机制的阻塞工具也是AQS框架的基石之一另外两个则是CAS操作、volatile关键字。 ​ 每个Java线程内部其对应着OS线程而对线程的操作也就是对于操作系统的操作。JDK提供Unsafe类可以直接操作底层系统它本身具有直接内存管理、线程阻塞唤醒的支持、CAS操作的支持、直接操作类、对象、变量等强大的功能。Unsafe类关于线程阻塞、唤醒有提供Parker类Parker类继承PlatformParker。 ​ PlatformParker内部具有POSIX库标准的互斥量(锁)mutex和条件变量condition那么实际上Parker的对于park和unpark的实现实际上就是用这两个工具实现的。 ​ LockSupport.park方法实质上就是调用了Unsafe类的Native方法执行LockSupport.park方法不会释放此前获取到的synchronized锁或者lock锁因为LockSupport的方法根本就与我们常说的“锁”无关。其本质依赖了mutex和Condition工具。
http://www.dnsts.com.cn/news/171087.html

相关文章:

  • 做网站成本做衣服视频有些什么网站
  • 互联网技术的概念爱站网seo工具
  • 创建网站的向导和模板 信息技术教资面试做机械设备销售的那个网站好
  • 建设部网站资质查询6中国电力建设集团网站
  • 做视频网站可以自学吗网游推广
  • 自己做的网站提示不安全吗大连网站建设咨询
  • 网站php环境搭建网站百度百科怎么做
  • wordpress 源文件导入邢台seo关键词引流
  • 厦门在线制作网站《php网站开发》课程资料
  • 电商网站建设试题西宁互联网公司
  • 做网站备完备案需要干什么动态的网站大概多少钱
  • 网站查询服务器ip河北城乡住房建设厅网站
  • 南京哪家做网站好网站建设的业务好做吗
  • 郑州大学现代远程教育 《网页设计与网站建设》个人主页淮南做网站推广
  • 交互式网站的发展做网站多少钱
  • 企业网站建设平台开发公司合作协议
  • 广州网络营销服务公司宁波seo
  • 网站为什么做黄词骗流量怎么做互联网推广
  • 如何做能上传视频网站西安注册公司在哪个网站
  • 兰州网站建设与优化推广信息发布平台
  • 怎么选择网站建设公司电子商务营销策略有哪些
  • 安庆市网站建设制作网站开发方案及报价
  • 怎样做免费商城网站推广普通话手抄报模板
  • 南和邢台网站制作网站代码 商品添加分类
  • 网站建设与管理题目深圳建网站的公司
  • it培训机构都有哪些关键词排名优化易下拉技巧
  • h5页面生成常德自助建站seo
  • 龙溪营销型网站制作如何注册企业
  • 做网站的软件是哪个桂林市工程建设项目招标网站
  • 深圳服装网站建设智慧旅游网站建设方案