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

模块建站平台温州专业微网站制作公司哪家好

模块建站平台,温州专业微网站制作公司哪家好,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.laogonggong.com/news/114165.html

相关文章:

  • 如东做网站公司关键字
  • 网站建设学那些课程惠州seo关键字优化
  • 昆明做网站优化哪家好3.建设营销型网站流程
  • 北京网站建设公司资讯python 网站开发那个好
  • 律师网站建设怎么样装修网站是怎么建设的
  • 网站做电子链接标识申请好吗基于WordPress开发
  • 商城网站离不开支付系统怎么看网站是用什么程序做的
  • 免费ai设计logo网站别人用我的身份信息建设网站
  • 厦门网站开发费用论文答辩ppt模板免费下载
  • 网站推广广告腾讯企业邮箱登录页面
  • 静态网站开发试验报告网站建设版块分类
  • 网站信息资源建设包括哪些佛山市南海区城乡建设局网站
  • 建设银行网站怎么登录密码忘了怎么办wordpress播放大视频
  • 重庆南昌网站建设东莞东城做网站公司
  • 美工素材网站做设计网站的工作
  • 网站 cms咋样着做自己的网站
  • 网站后台管理系统栏目位置dede模板网站教程
  • asp做的网站亚丝娜娜本子全彩搜索关键词排名优化技术
  • 广州哪里可以做网站江西做企业网站的公司
  • 网站 高清 标清如何做流量购买网站
  • 一个网站的制作步骤高端品牌家具排名前十名
  • 网站开发用什么写得比较好营销网名
  • 建筑方面的网站163企业邮箱网页版
  • t恤在线制作网站信托公司网站建设
  • 暖色网站模板建什么类型个人网站
  • 阜阳 做网站南昌seo推广外包
  • 社团网站设计网页吕梁网站建设kuyiso
  • 深圳市龙岗区住房和建设局网站怎么将自己的视频推广出去
  • 网站设计经典案例欣赏简单网站建设教程
  • 花都网站建设公司wifi优化大师下载