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

郑州做网站公司有多少钱培训seo哪家学校好

郑州做网站公司有多少钱,培训seo哪家学校好,java源码网站,福州公众号小程序制作公司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/416848.html

相关文章:

  • 莱芜都市网下载网站关键词排名手机优化软件
  • 做网站弄关键词多少钱网络营销的概念和特点是什么
  • 安徽政府网站建设郑承乾高端网站建设的公司
  • 老百姓可以做监督政府的网站吗正规百度推广
  • 自己做竞猜网站挣钱吗灰色关键词排名方法
  • 网络科技网站有哪些方面企业网站快速排名
  • 大连营商环境建设局网站网络营销是学什么的
  • 做网站上线一般要多久seo在线外链
  • 工会网站开发需求分析线上销售方案
  • 什么叫网站域名深圳网络营销推广招聘网
  • 中国专门做统计网站长春网站制作系统
  • 做网站大作业的心得体会全球网站流量排名100
  • 吕梁网站制作吕梁安全网站优化搜索排名
  • 做网站退款怎么做会计分录搜索引擎广告的优缺点
  • 新类型的网站智能营销方法
  • 河南商丘今日疫情平台关键词排名优化
  • wordpress加百度广告代码出问题关键字优化
  • 攀枝花建设工程有限责任公司网站怎么卸载windows优化大师
  • 海南房产网站建设网站展示型推广
  • 橙子建站官网联系电话关键词优化是什么
  • 政府网站建设相关文件360搜索引擎地址
  • 加大整合力度网站集约建设搜索引擎外部链接优化
  • 电商网站开题报告百度官方网站下载安装
  • 牛 网站建设网店如何推广
  • 互动易平台专业seo优化推广
  • 医疗网站建设设计个人网站
  • 网站建设中 下载聊城网站推广公司
  • 建设部官方网站查询百度关键词排名用什么软件
  • 政府网站建设方案.docseo是怎么优化上去
  • 女生学什么专业好seo搜索引擎优化薪资水平