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

芜湖营销型网站建设2023设计院裁员惨烈程度

芜湖营销型网站建设,2023设计院裁员惨烈程度,wordpress只显示一个主题,网站共用数据库1 synchronized的JVM底层原理实现的精简理解 Java 虚拟机中的synchronized基于进入和退出Monitor对象#xff08;也称为管程或监视器锁#xff09;实现#xff0c; 无论是显式同步(synchronized作用在同步代码块#xff0c;有明确的 monitorenter 和 monitorexit 指令) 还是…1 synchronized的JVM底层原理实现的精简理解 Java 虚拟机中的synchronized基于进入和退出Monitor对象也称为管程或监视器锁实现 无论是显式同步(synchronized作用在同步代码块有明确的 monitorenter 和 monitorexit 指令) 还是隐式同步synchronized作用在方法区调用指令ACC_SYNCHRONIZED 标志都是如此都是使得Monitor对象里面的count计数期增加或者减少来实现然后synchronized属于重量级锁效率低下因为监视器锁monitor是依赖于底层的操作系统的Mutex Lock来实现的而操作系统实现线程之间的切换时需要从用户态转换到核心态这个状态之间的转换需要相对比较长的时间时间成本相对较高这也是为什么早期的synchronized效率低的原因ReentrantLock底层实现依赖于特殊的CPU指令比如发送lock指令和unlock指令不需要用户态和内核态的切换所以效率高这里和volatile底层原理类似。 2 Java对象头与Monitor的理解 1Java对象的构成 在JVM中对象在内存中的布局分为三块区域对象头、实例数据和对齐填充 实例变量类的属性数据信息包括父类的属性信息。填充数据虚拟机要求对象起始地址必须是8字节的整数倍这里和C语言的结构体内存对齐还是有点不一样。对象头jvm中采用2个字节来存储对象头(如果对象是数组则会分配3个字多出来的1个字记录的是数组长度)其主要结构是由Mark Word 和 Class Metadata Address  虚拟机位数          头对象结构                              作用 32/64bit               Mark Word                               存储对象的hashCode、锁信息或分代年龄或GC标志等信息 32/64bit               Class Metadata Address         类型指针指向对象的类元数据JVM通过这个指针确定该对象是哪个类的实例。 32位JVM的Mark Word默认存储结构如下 锁状态25bit4bit1bit是否是偏向锁2bit 锁标志位无锁状态对象HashCode对象分代年龄001 Mark Word默认存储结构外还有如下可能变化的结构 2monitor对象 轻量级锁和偏向锁是Java 6 对 synchronized 锁进行优化后新增加,重量级锁也就是通常说synchronized的对象锁锁标识位为10其中指针指向的是monitor对象,每个对象都存在着一个 monitor 与之关联对象与其 monitor 之间的关系有存在多种实现方式如monitor可以与对象一起创建销毁或当线程试图获取对象锁时自动生成但当一个 monitor 被某个线程持有后它便处于锁定状态。在Java虚拟机(HotSpot)中monitor是由ObjectMonitor实现的其主要数据结构如下位于HotSpot虚拟机源码ObjectMonitor.hpp文件C实现的   ObjectMonitor() {_header NULL;_count 0; //记录个数_waiters 0,_recursions 0;_object NULL;_owner NULL;_WaitSet NULL; //处于wait状态的线程会被加入到_WaitSet_WaitSetLock 0 ;_Responsible NULL ;_succ NULL ;_cxq NULL ;FreeNext NULL ;_EntryList NULL ; //处于等待锁block状态的线程会被加入到该列表_SpinFreq 0 ;_SpinClock 0 ;OwnerIsThread 0 ;}ObjectMonitor中有两个队列_WaitSet 和 _EntryList用来保存ObjectWaiter对象列表( 每个等待锁的线程都会被封装成ObjectWaiter对象)_owner指向持有ObjectMonitor对象的线程当多个线程同时访问一段同步代码时首先会进入 _EntryList 集合当线程获取到对象的monitor 后进入 _Owner 区域并把monitor中的owner变量设置为当前线程同时monitor中的计数器count加1若线程调用 wait() 方法将释放当前持有的monitorowner变量恢复为nullcount自减1同时该线程进入 WaitSe t集合中等待被唤醒。若当前线程执行完毕也将释放monitor(锁)并复位变量的值以便其他线程进入获取monitor(锁) monitor对象存在于每个Java对象的对象头中(存储的指针的指向)synchronized锁便是通过这种方式获取锁的也是为什么Java中任意对象可以作为锁的原因同时也是notify/notifyAll/wait等方法存在于顶级对象Object中的原因 3 synchronized作用于代码块 synchronized作用代码块后反编译的字节码关键如下 3: monitorenter //进入同步方法 //..........省略其他 15: monitorexit //退出同步方法 16: goto 24 //省略其他....... 21: monitorexit //退出同步方法 从字节码中可知同步语句块的实现使用的是monitorenter 和 monitorexit 指令其中monitorenter指令指向同步代码块的开始位置monitorexit指令则指明同步代码块的结束位置当执行monitorenter指令时当前线程将试图获取 objectref(即对象锁) 所对应的 monitor 的持有权当 objectref 的 monitor 的进入计数器为 0那线程可以成功取得 monitor并将计数器值设置为 1取锁成功。如果当前线程已经拥有 objectref 的 monitor 的持有权那它可以重入这个 monitor (关于重入性稍后会分析)重入时计数器的值也会加 1。倘若其他线程已经拥有 objectref 的 monitor 的所有权那当前线程将被阻塞直到正在执行线程执行完毕即monitorexit指令被执行执行线程将释放 monitor(锁)并设置计数器值为0 其他线程将有机会持有 monitor 。值得注意的是编译器将会确保无论方法通过何种方式完成方法中调用过的每条 monitorenter 指令都有执行其对应 monitorexit 指令而无论这个方法是正常结束还是异常结束。为了保证在方法异常完成时 monitorenter 和 monitorexit 指令依然可以正确配对执行编译器会自动产生一个异常处理器这个异常处理器声明可处理所有的异常它的目的就是用来执行 monitorexit 指令。从字节码中也可以看出多了一个monitorexit指令它就是异常结束时被执行的释放monitor 的指令   4 synchronized作用于方法 synchronized作用代码块后反编译的字节码关键如下 descriptor: ()V//方法标识ACC_PUBLIC代表public修饰ACC_SYNCHRONIZED指明该方法为同步方法flags: ACC_PUBLIC, ACC_SYNCHRONIZEDCode: JVM可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。当方法调用时调用指令将会 检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置如果设置了执行线程将先持有monitor虚拟机规范中用的是管程一词 然后再执行方法最后再方法完成(无论是正常完成还是非正常完成)时释放monitor。在方法执行期间执行线程持有了monitor其他任何线程都无法再获得同一个monitor。如果一个同步方法执行期间抛 出了异常并且在方法内部无法处理此异常那这个同步方法所持有的monitor将在异常抛到同步方法之外时自动释放   5 synchronized的优化 锁的状态总共有四种无锁状态、偏向锁、轻量级锁和重量级锁 其膨胀方向无锁——偏向锁——轻量级锁——重量级锁并且膨胀方向不可逆。  1)  偏向锁: 核心思想是如果一个线程获得了锁那么锁就进入偏向模式此时Mark Word 的结构也变为偏向锁结构当这个线程再次请求锁时无需再做任何同步操作即获取锁的过程这样就省去了大量有关锁申请的操作从而也就提供程序的性能,对于没有锁竞争的场合偏向锁有很好的优化效果毕竟极有可能连续多次是同一个线程申请相同的锁。但是对于锁竞争比较激烈的场合偏向锁就失效了因为这样场合极有可能每次申请锁的线程都是不相同的因此这种场合下不应该使用偏向锁否则会得不偿失需要注意的是偏向锁失败后并不会立即膨胀为重量级锁而是先升级为轻量级锁。下面我们接着了解轻量级锁   2)  轻量级锁: “对绝大部分的锁在整个同步周期内都不存在竞争”注意这是经验数据。需要了解的是轻量级锁所适应的场景是线程交替执行同步块的场合如果存在同一时间访问同一锁的场合就会导致轻量级锁膨胀为重量级锁。 3) 、重量级锁 重量级锁是由轻量级锁升级而来当同一时间有多个线程竞争锁时锁就会被升级成重量级锁此时其申请锁带来的开销也就变大 4) 、锁消除 消除锁是虚拟机另外一种锁的优化这种优化更彻底在JIT编译时对运行上下文进行扫描去除不可能存在竞争的锁 部分参考博客https://blog.csdn.net/javazejian/article/details/72828483
http://wiki.neutronadmin.com/news/82538/

相关文章:

  • 专业3合1网站建设价格网站建设与代运营产品介绍
  • 培训型网站建设方案东莞广告公司电话
  • 网站小程序app定制开发wordpress 夜间模式
  • 网站在网络文化建设方面的成果深圳宝安中心区
  • vs和sql怎么做网站深圳宝安外贸网站建设公司
  • tornado 网站开发目前做哪个网站能致富
  • 服装电子商务网站版式设计网站建设活动
  • 手机网站与电脑网站兼容珠海手机网站建设
  • 现在济南可以正常出入吗企业网站优化策略
  • 网站登录按钮点击没反应什么原因淘宝入口
  • 商城网站建设都需要多少钱专业网站建设加工
  • 网站建站网站496565js网站效果
  • 免费做效果图的网站网站地图怎么提交
  • 手机管理网站模板宁波妇科医院私立哪家医院好
  • 鹤山网站建设花店网站建设论文
  • 单页营销网站后台做不了大流量网站
  • 石家庄建站培训网络免费推广网站
  • 南宁网站快速优网页编辑器怎么打开
  • 做啥英文网站赚钱网站建设业务提成
  • ssh jsp做网站海南省生态文明村建设促进会网站
  • 山东网站建设开发维护企查查免费查询
  • 如何用vs2012做网站做标签网站是什么
  • 专做药材的网站有哪些在上海做兼职在哪个网站
  • 合肥做微网站建设wordpress子页面不显示
  • 网站建设简单wordpress进阶教程
  • 南昌免费做网站广东省公共资源交易中心地址
  • 乌克兰设计网站建设临平房产做网站的公司
  • 搭建网站的五大步骤四川成都网站优化
  • 网站商城设计wordpress清理主题
  • 宿迁企业网站设计会qt怎么做网站