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

天津企业网站制作阿里云建站和公司建站有什么优势

天津企业网站制作,阿里云建站和公司建站有什么优势,wordpress 优惠主机,做网站运营工资是不是很低转载自 深入理解多线程#xff08;四#xff09;—— Moniter的实现原理本文是《深入理解多线程系列文章》的第四篇。点击查看原文#xff0c;阅读该系列所有文章。 在深入理解多线程#xff08;一#xff09;——Synchronized的实现原理中介绍过关于Synchronize的实现原理…转载自 深入理解多线程四—— Moniter的实现原理本文是《深入理解多线程系列文章》的第四篇。点击查看原文阅读该系列所有文章。 在深入理解多线程一——Synchronized的实现原理中介绍过关于Synchronize的实现原理无论是同步方法还是同步代码块无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的那么这篇来介绍下什么是Monitor。 操作系统中的管程 如果你在大学学习过操作系统你可能还记得管程monitors在操作系统中是很重要的概念。同样Monitor在java同步机制中也有使用。 管程 (英语Monitors也称为监视器) 是一种程序结构结构内的多个子程序对象或模块形成的多个工作线程互斥访问共享资源。这些共享资源一般是硬件设备或一群变量。管程实现了在一个时间点最多只有一个线程在执行管程的某个子程序。与那些通过修改数据结构实现互斥访问的并发程序设计相比管程实现很大程度上简化了程序设计。 管程提供了一种机制线程可以临时放弃互斥访问等待某些条件得到满足后重新获得执行权恢复它的互斥访问。Java线程同步相关的Moniter 在多线程访问共享资源的时候经常会带来可见性和原子性的安全问题。为了解决这类线程安全的问题Java提供了同步机制、互斥锁机制这个机制保证了在同一时刻只有一个线程能访问共享资源。这个机制的保障来源于监视锁Monitor每个对象都拥有自己的监视锁Monitor。 先来举个例子然后我们在上源码。我们可以把监视器理解为包含一个特殊的房间的建筑物这个特殊房间同一时刻只能有一个客人线程。这个房间中包含了一些数据和代码。如果一个顾客想要进入这个特殊的房间他首先需要在走廊Entry Set排队等待。调度器将基于某个标准比如 FIFO来选择排队的客户进入房间。如果因为某些原因该客户客户暂时因为其他事情无法脱身线程被挂起那么他将被送到另外一间专门用来等待的房间Wait Set这个房间的可以可以在稍后再次进入那件特殊的房间。如上面所说这个建筑屋中一共有三个场所。总之监视器是一个用来监视这些线程进入特殊的房间的。他的义务是保证同一时间只有一个线程可以访问被保护的数据和代码。 Monitor其实是一种同步工具也可以说是一种同步机制它通常被描述为一个对象主要特点是 对象的所有方法都被“互斥”的执行。好比一个Monitor只有一个运行“许可”任一个线程进入任何一个方法都需要获得这个“许可”离开时把许可归还。通常提供singal机制允许正持有“许可”的线程暂时放弃“许可”等待某个谓词成真条件变量而条件成立后当前进程可以“通知”正在等待这个条件变量的线程让他可以重新去获得运行许可。监视器的实现 在Java虚拟机(HotSpot)中Monitor是基于C实现的由ObjectMonitor实现的其主要数据结构如下ObjectMonitor() {_header       NULL;_count         0;_waiters       0,_recursions   0;_object       NULL;_owner         NULL;_WaitSet       NULL;_WaitSetLock   0 ;_Responsible   NULL ;_succ         NULL ;_cxq           NULL ;FreeNext       NULL ;_EntryList     NULL ;_SpinFreq     0 ;_SpinClock     0 ;OwnerIsThread 0 ;} 源码地址objectMonitor.hpp ObjectMonitor中有几个关键属性 _owner指向持有ObjectMonitor对象的线程_WaitSet存放处于wait状态的线程队列_EntryList存放处于等待锁block状态的线程队列_recursions锁的重入次数_count用来记录该线程获取锁的次数当多个线程同时访问一段同步代码时首先会进入_EntryList队列中当某个线程获取到对象的monitor后进入_Owner区域并把monitor中的_owner变量设置为当前线程同时monitor中的计数器_count加1。即获得对象锁。 若持有monitor的线程调用wait()方法将释放当前持有的monitor_owner变量恢复为null_count自减1同时该线程进入_WaitSet集合中等待被唤醒。若当前线程执行完毕也将释放monitor(锁)并复位变量的值以便其他线程进入获取monitor(锁)。如下图所示ObjectMonitor类中提供了几个方法 获得锁释放锁除了enter和exit方法以外objectMonitor.cpp中还有 void      wait(jlong millis, bool interruptable, TRAPS); void      notify(TRAPS); void      notifyAll(TRAPS); 等方法。 总结 上面介绍的就是HotSpot虚拟机中Moniter的的加锁以及解锁的原理。 通过这篇文章我们知道了sychronized加锁的时候会调用objectMonitor的enter方法解锁的时候会调用exit方法。事实上只有在JDK1.6之前synchronized的实现才会直接调用ObjectMonitor的enter和exit这种锁被称之为重量级锁。为什么说这种方式操作锁很重呢 Java的线程是映射到操作系统原生线程之上的如果要阻塞或唤醒一个线程就需要操作系统的帮忙这就要从用户态转换到核心态因此状态转换需要花费很多的处理器时间对于代码简单的同步块如被synchronized修饰的get 或set方法状态转换消耗的时间有可能比用户代码执行的时间还要长所以说synchronized是java语言中一个重量级的操纵。 所以在JDK1.6中出现对锁进行了很多的优化进而出现轻量级锁偏向锁锁消除适应性自旋锁锁粗化(自旋锁在1.4就有 只不过默认的是关闭的jdk1.6是默认开启的)这些操作都是为了在线程之间更高效的共享数据 解决竞争问题。后面的文章会继续介绍这几种锁以及他们之间的关系。
http://www.pierceye.com/news/332634/

相关文章:

  • 班级网站怎样做ppt模板免费素材
  • 网站建设及运营 多少钱域名抢注哪个平台好
  • 抚顺营销型网站建设吴江开发区人才网
  • 余姚建设网站wordpress百度分享插件
  • iis网站服务器 建立出现问题吉林市城市建设档案馆官方网站
  • wordpress网站图片迁移打开一个网站为繁体字是怎么做的
  • 东莞规划局官方网站做网站要学一些什么
  • 网站动效是代码做的吗网站模板侵权问题
  • 网站开发语言总结有哪些怎么样让网站宣传自己
  • 网站建设公司哪家好找建设网站公司哪家好
  • 网站建设网上学a8直播免费版
  • 网上下载的免费网站模板怎么用灯箱网站开发
  • 四平市建设局网站贵州省民贸民品企业信息管理系统
  • 周口网站制作公司哪家好河南省信息服务平台官网
  • 然后建设自营网站湘潭市优化办
  • 大兴专业网站开发公司皮具网站建设策划书
  • 广告投放跟网站建设一样吗呼和浩特免费制作网站
  • 个人做网站的时代已经过去个人手机网站
  • 用vps做网站深圳广告公司招聘安装工人
  • 建设电影网站怎么上传电影如何建企业网站
  • 响应式网站制作公司org域名购买
  • 石家庄网站建设德信互联科技有限公司爬取漫画数据做网站
  • 国内免费iphone网站百度自然排名优化
  • 自己做网站主机做网站和推广
  • wordpress 淘宝嘉兴做网站优化
  • h5 网站开发流程asp个人网站建设
  • 网站建设 正邦企业邮箱怎么认证
  • 建设流网站项目成都住建局官网首页
  • 网站简历文字如何空行产品如何推广市场
  • 吕梁网站设计腾讯营销平台