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

郑州做网站公司有多少钱推广排名seo

郑州做网站公司有多少钱,推广排名seo,安装wordpress 空白页,怎么选择锦州网站建设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/229297.html

相关文章:

  • 企业网站必须备案seo技术员
  • wordpress网站代码文件太多茂名网络推广
  • 米拓网站建设-app定制开发福州网站优化公司
  • 贵州5g网站建设郑州seo优化外包
  • 网站服务器在哪租河南企业站seo
  • 网站开发培训深圳自媒体营销的策略和方法
  • 简单网站建设软件seo产品优化免费软件
  • 泰州 做网站百度热词
  • 动态网站建设常见的4种技术sem搜索引擎营销
  • 手机网站一键分享到微信自媒体软文发布平台
  • 推进网站集约化建设的作用网络推广平台有哪些?
  • 毕业设计网页制作网站建设关于进一步优化当前疫情防控措施
  • 个人网站 可以做论坛吗nba排名
  • 合肥企业快速建站蜗牛精灵seo
  • 服务好的郑州网站建设想学网络营销怎么学
  • 做网站过时了营销策略主要包括哪些
  • java 框架用来做网站seo搜索引擎优化费用
  • 国家建设工程网官方网站怎样在网上做推广
  • 网站的营销特点seo社区
  • 襄阳seo费用无锡seo排名收费
  • 个人做负面网站犯法不网页制作代码
  • jsp做网站的书企业网站建设专业服务
  • 做电影网站有什么好处和坏处搜索引擎平台
  • 英国网站域名百度排名优化专家
  • ui培训怎么样网站优化一年多少钱
  • 网站的seo优化怎么做如何注册一个自己的网站
  • 大余做网站建设百度权重等级
  • 1.0钓鱼网站开发--站点说明百度站长工具怎么查排名
  • 永康做网站槐荫区网络营销seo
  • 房地产行情最新消息长春百度网站优化