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

东凤镇做网站公司seo短期培训班

东凤镇做网站公司,seo短期培训班,天津做网站公司,网站漂浮物怎么做Java对象结构 synchronized锁升级过程 为了优化synchronized锁的效率,在JDK6中,HotSpot虚拟机开发团队提出了锁升级的概念,包括偏向锁、轻量级锁、重量级锁等,锁升级指的就是“无锁 --> 偏向锁 --> 轻量级锁 --> 重量级…

Java对象结构

synchronized锁升级过程

为了优化synchronized锁的效率,在JDK6中,HotSpot虚拟机开发团队提出了锁升级的概念,包括偏向锁、轻量级锁、重量级锁等,锁升级指的就是“无锁 --> 偏向锁 --> 轻量级锁 --> 重量级锁”。

synchronized同步锁相关信息保存到锁对象的对象头里面的Mark Word中,锁升级功能主要是依赖Mark Word中锁标志位和是否偏向锁标志位来实现的。

无锁 -> 偏向锁:第一个锁获得它的线程,会在对象头(Mark Word中)记录锁偏向的线程ID。

偏向锁 -> 轻量级锁:当A线程持有偏向锁时,此时B线程通过CAS自旋的方式去竞争锁,如果竞争成功修改偏向锁的线程ID依旧是偏向锁,否则锁会升级为轻量级锁。

轻量级锁 -> 重量级锁:当A线程持有轻量级锁时,此时B线程通过CAS自旋的方式去竞争锁,如果线程B自旋一定次数后依旧无法获得锁,则锁会升级为重量级锁。

注意:可以使用-XX:UseBiasedLocking参数关闭偏向锁,此时默认进入轻量级锁。

synchronized偏向锁的撤销

偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程不会主动去释放偏向锁。偏向锁的撤销,需要等待全局安全点safepoint,它会首先暂停拥有偏向锁的线程A,然后判断这个线程A,此时有两种情况:

synchronized重量级锁的实现原理

同步分为显式同步和隐式同步,显式同步,指的是有明确的monitorenter和monitorexit指令。隐式同步,指的是同步方法是由方法调用指令读取运行时常量池中方法的ACC_SYNCHRONIZED标志来隐式实现的。synchronized修饰的方法是隐式同步(使用ACC_SYNCHRONIZED标志),synchronized修饰的同步代码块是显式同步(使用monitorenter和monitorexit指令)。

public class SyncCodeBlock {public int i;public void syncTask(){//同步代码库synchronized (this){i++;}}
}//===========主要看看syncTask方法实现================
public void syncTask();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=3, locals=3, args_size=1
0: aload_0
1: dup
2: astore_1
3: monitorenter  //注意此处,进入同步方法
4: aload_0
5: dup
6: getfield      #2             // Field i:I
9: iconst_1
10: iadd
11: putfield      #2            // Field i:I
14: aload_1
15: monitorexit   //注意此处,退出同步方法
16: goto          24
19: astore_2
20: aload_1
21: monitorexit //注意此处,退出同步方法
22: aload_2
23: athrow
24: return
Exception table:
public class SyncMethod {public int i;public synchronized void syncTask(){i++;}
}//==================syncTask方法======================
public synchronized void syncTask();
descriptor: ()V
//方法标识ACC_PUBLIC代表public修饰,ACC_SYNCHRONIZED指明该方法为同步方法
flags: ACC_PUBLIC, ACC_SYNCHRONIZED
Code:stack=3, locals=1, args_size=10: aload_01: dup2: getfield      #2                  // Field i:I5: iconst_16: iadd7: putfield      #2                  // Field i:I10: returnLineNumberTable:line 12: 0line 13: 10

显式同步是利用monitorenter和monitorexit这两个字节码指令来区分是否同步,它们分别位于同步代码块的开始和结束位置。monitorenter指令后会插入LoadLoadLoadStore 屏障,monitorexit指令后会插入StoreStoreStoreLoad 屏障。

隐式同步是利用ACC_SYNCHRONIZED标志来区分是否同步,进入方法前会插入LoadLoadLoadStore 屏障,退出方式时后会StoreStoreStoreLoad 屏障。执行线程会先获取monitor,获取成功之后才能执行方法体,方法执行完后再释放monitor。

注意:两种同步方式本质上没有区别,都是通过monitor对象来实现线程同步。

加锁流程

加锁成功

当JVM执行到monitorenter指令时,当前线程试图获取monitor对象的_Owner是否是当前线程,如果已经被当前线程所持有,_count+1,_Owner指向持有monitor对象的线程。

加锁失败

如果获取monitor对象失败,该线程则会进入阻塞队列(_EntryList),并一直阻塞。

释放锁流程

当JVM执行到monitorexit指令时,_count-1,当锁计数器为0时,_Owner恢复为null,表示该锁被释放了,如果_EntryList非空,那么通知_EntryList中所有阻塞的线程,去竞争然后成为下一个_Owner。

wait流程

当持有锁的线程调用wait()方法时,持有锁的线程会进入等待队列(_WaitSet)等待被唤醒,同时count-1,_Owner恢复为null。

notify/notifyAll流程

当有线程执行notify()/notifyAll()方法时,会随机唤醒一个或所有线程从_WaitSet队列进入到_EntryList队列中,只有线程持有者才能调用notify(),当锁释放时会通知_EntryList中所有阻塞的线程。

http://www.dtcms.com/wzjs/125612.html

相关文章:

  • 中信银行网站怎么做的怎么烂优化网站排名技巧
  • 网站建设费用是什么科目小学生简短小新闻十条
  • 做网站的介绍国际最新消息
  • 接收新网站如何做诊断百度软件下载
  • 有哪些网站可以免费做推广的企业网络推广方法
  • 长春网站开发招聘作品提示优化要删吗
  • 做网站是用什么技术的网页制作免费网站制作
  • 亚马逊用什么网站上传做新品好怎么做推广和宣传平台
  • 备案域名查询官网上海seo
  • 低价做网站靠谱吗引擎优化seo怎么做
  • 做网站 源代码搜索引擎大全网站
  • 网站合作建设合同的搜索引擎优化
  • wordpress html5支持seo营销推广公司
  • 网页设计公司开设需要投资多少钱seo外链推广员
  • 做网站素材在哪找百度旗下有哪些app
  • 创建微网站深圳网站营销seo电话
  • crm系统介绍专业seo公司
  • 如何做网站的滚动图片免费信息推广平台
  • 太原网站建设外包营销的目的有哪些
  • 网站建设风险管理灰色行业推广平台
  • 怎么样做团购网站国内最大的搜索引擎
  • 做旅游网站设计的感想百度关键词竞价和收费的方法
  • 泉州手机网站开发seo初学教程
  • 企业网站的党建文化怎么做网络营销推广方式包括哪几种
  • 北京高端企业网站百度助手
  • wordpress多个菜单menuseo职业培训班
  • 科郑州网站建设国内最新新闻消息今天的
  • 东莞做营销型网站的指数基金排名前十名
  • 网站开发的经费预算aso优化榜单
  • 华为荣耀官网手机旗舰店百度上如何做优化网站