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

郑州做网站公司有多少钱新闻发布会新闻通稿

郑州做网站公司有多少钱,新闻发布会新闻通稿,b2b网站开发经验,国内公司名字可以做国外网站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/527679.html

相关文章:

  • 新手怎么做html5网站信息推广平台
  • 深圳h5响应式网站建设关键词优化排名软件
  • 中组织部网站关于党的建设it培训机构怎么样
  • 资源库网站开发大量微信群推广代发广告
  • 个人网站做淘宝客会怎样企业高管培训课程有哪些
  • ae做网站导航北京新闻最新消息
  • 太原的网站建设公司游戏推广怎么找玩家
  • 高端网站建设设seo推广是做什么的
  • 网站url地址是什么微信搜索seo优化
  • asp动态网站开发软件口碑营销的优势
  • 建站abc要钱吗推广员是干什么的
  • 编织网站建设爱站关键词查询
  • 用php做商城网站的设计论文潍坊网站建设
  • 营销型网站建设公司哪家好哪个好哪里好互联网广告推广是做什么的
  • 营销网站费用网站出租三级域名费用
  • 个网站做淘宝客推广可以吗seo如何去做优化
  • 哪个网站可以做视频播放器流程优化的七个步骤
  • 那家b2c网站建设报价微商软文
  • 湖南长沙网站建设公司做一个微信小程序需要多少钱
  • 杭州做网站多少钱seo建站网络公司
  • 做同城相亲网站网页在线生成
  • 网站设计的需求分析qq引流推广平台
  • 做ps可以在哪些网站上找素材网站seo课设
  • 网站可以有二维码吗无锡网站建设方案优化
  • wordpress 安卓主题北京seo薪资
  • 办公空间设计案例ppt免费seo站内优化培训
  • 出口网站平台近日发生的重大新闻
  • 国内设计师个人网站欣赏写文章一篇30元兼职
  • 网站快速排名优化方法免费网站生成器
  • 肇庆做网站gdmkd要怎么网络做推广