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

网站建站公司模板网站建设与管理教学视频

网站建站公司模板,网站建设与管理教学视频,临沂免费模板建站,seo网站优化方大家好#xff0c;我是烤鸭: 前几天看马士兵老师的并发的课#xff0c;里边讲到了 synchronize 锁的膨胀过程#xff0c;今天想用代码演示一下。 1. 简单介绍 关于synchronize jdk 1.5 以后的优化#xff0c;由重量级锁调整为膨胀过程。分别是 偏向锁 轻量级锁#xff0…大家好我是烤鸭: 前几天看马士兵老师的并发的课里边讲到了 synchronize 锁的膨胀过程今天想用代码演示一下。 1.  简单介绍 关于synchronize jdk 1.5 以后的优化由重量级锁调整为膨胀过程。分别是 偏向锁 轻量级锁自旋锁 重量级锁。 2.  用例编写 pom文件增加 jol的包用于看对象头的信息。 !-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -- dependencygroupIdorg.openjdk.jol/groupIdartifactIdjol-core/artifactIdversion0.10/version /dependency 下面的注释已经写的挺清楚的了关于锁几种状态的转换。  SyncSourceTest.java package src.source;import org.openjdk.jol.info.ClassLayout;/*** Created by test on 2020/5/10*/ public class SyncSourceTest {static Object noLock;static Object biaseLock;static Object lightLock;static Object heavyLock;public static void main(String[] args) throws InterruptedException {noLock new Object();// 无锁状态,由于print 方法是synchronize 修饰,其实打印语句就已经是加偏向锁了(如果满足下面的偏向锁条件)System.out.print(线程[Thread.currentThread().getName()]:无锁状态对象布局:ClassLayout.parseInstance(noLock).toPrintable());// 偏向锁,由于JVM 默认偏向锁4s后开启,可以线程sleep.5 或者设置VM参数关闭延迟 -XX:BiasedLockingStartupDelay0Thread.sleep(5000L);biaseLock new Object();System.out.println(线程[Thread.currentThread().getName()]:偏向锁状态对象布局:ClassLayout.parseInstance(biaseLock).toPrintable());// 轻量级锁,由于轻量级锁是偏向锁升级的,需要先给对象一个偏向锁,如果不加偏向锁只有一个线程加锁变成偏向锁lightLock new Object();synchronized (lightLock) {System.out.println(线程[Thread.currentThread().getName()]:[轻量级锁提前加偏向锁]轻量级锁状态对象布局:ClassLayout.parseInstance(lightLock).toPrintable());}synLight();// 重量级锁heavyLock new Object();synHeavy();}public static void synLight() throws InterruptedException {for (int i 0; i 1; i) {getLightLock();}}public static void getLightLock() {new Thread(() - {try {synchronized (lightLock){System.out.println(线程[Thread.currentThread().getName()]:轻量级锁状态对象布局:ClassLayout.parseInstance(lightLock).toPrintable());}} catch (Exception e) {e.printStackTrace();}}).start();}public static void synHeavy() throws InterruptedException {for (int i 0; i 2; i) {getHeavyLock();}}private static void getHeavyLock() {new Thread(() - {try {synchronized (heavyLock){System.out.println(线程[Thread.currentThread().getName()]:重量级锁状态对象布局:ClassLayout.parseInstance(heavyLock).toPrintable());}} catch (Exception e) {e.printStackTrace();}}).start();} }关于对象布局我们就先不研究了这里重点说一下 对象头。 HotSpot虚拟机的对象头Object Header分为两部分第一 部分用于存储对象自身的运行时数据如哈希码HashCode、GC分代年龄Generational GC Age 等。这部分数据的长度在32位和64位的Java虚拟机中分别会占用32个或64个比特官方称它为“Mark Word”。这部分是实现轻量级锁和偏向锁的关键。另外一部分用于存储指向方法区对象类型数据的指 针如果是数组对象还会有一个额外的部分用于存储数组长度。运行之后我们看一下输出信息线程[main]:无锁状态对象布局:java.lang.Object object internals:OFFSET SIZE TYPE DESCRIPTION VALUE0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)8 4 (object header) e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal 4 bytes external 4 bytes total 线程[main]:偏向锁状态对象布局:java.lang.Object object internals:OFFSET SIZE TYPE DESCRIPTION VALUE0 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5)4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)8 4 (object header) e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal 4 bytes external 4 bytes total线程[main]:[轻量级锁提前加偏向锁]轻量级锁状态对象布局:java.lang.Object object internals:OFFSET SIZE TYPE DESCRIPTION VALUE0 4 (object header) 05 28 e3 02 (00000101 00101000 11100011 00000010) (48441349)4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)8 4 (object header) e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal 4 bytes external 4 bytes total线程[Thread-2]:重量级锁状态对象布局:java.lang.Object object internals:OFFSET SIZE TYPE DESCRIPTION VALUE0 4 (object header) ba ee 0d 26 (10111010 11101110 00001101 00100110) (638447290)4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)8 4 (object header) e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal 4 bytes external 4 bytes total线程[Thread-0]:轻量级锁状态对象布局:java.lang.Object object internals:OFFSET SIZE TYPE DESCRIPTION VALUE0 4 (object header) 88 f5 a4 29 (10001000 11110101 10100100 00101001) (698676616)4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)8 4 (object header) e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal 4 bytes external 4 bytes total线程[Thread-1]:重量级锁状态对象布局:java.lang.Object object internals:OFFSET SIZE TYPE DESCRIPTION VALUE0 4 (object header) ba ee 0d 26 (10111010 11101110 00001101 00100110) (638447290)4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)8 4 (object header) e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)12 4 (loss due to the next object alignment) Instance size: 16 bytes Space losses: 0 bytes internal 4 bytes external 4 bytes totalProcess finished with exit code 0可以看出 无锁状态下各个状态下 mark word 后三位的值 无锁001 偏向101 轻量级锁000 重量级锁010 本来想写一下关于 轻量级锁 当前线程栈帧中 lock record 和 mark word的变化无奈查了很多资料不知道在哪可以看到 lock record有的说是显式或者隐式地创建lock record 空间咱也不清楚了。更多关于轻量级锁的源码看这篇吧。 https://blog.csdn.net/z69183787/article/details/104502540?utm_sourceapp 3. 编译class文件 看下面的class文件顺便说一下jvm的字节码指令。 可以看下 class文件里边对象的变化 7: putstatic     #3                  // Field noLock:Ljava/lang/Object; 静态变量 初始化时 39: getstatic     #3                  // Field noLock:Ljava/lang/Object; 获取 静态变量 而到了偏向锁对象初始化之前线程 睡眠了5秒。 57: ldc2_w        #16                   // long 5000l 5000入栈 60: invokestatic  #18                 // Method java/lang/Thread.sleep:(J)V 执行 sleep 135: monitorenter 对应的这行代码 synchronized (lightLock) 184: monitorexit  加锁结束 190: monitorexit  后面又有一次 加锁结束 原因是 线程内部加锁后调用 print 方法又加了一次锁(重入锁)所以需要释放两次。 D:\gitee\rep\leetcode-gradle\src\main\java\src\source javac -classpath .;D:\dev\repository\org\openjdk\jol\jol-core\0.10\jol-core-0.10.jar -encoding UTF-8 .\SyncSourceTest.javaD:\gitee\rep\leetcode-gradle\src\main\java\src\source javap -c .\SyncSourceTest.class Compiled from SyncSourceTest.java public class src.source.SyncSourceTest {static java.lang.Object noLock;static java.lang.Object biaseLock;static java.lang.Object lightLock;static java.lang.Object heavyLock;public src.source.SyncSourceTest();Code:0: aload_01: invokespecial #1 // Method java/lang/Object.init:()V4: returnpublic static void main(java.lang.String[]) throws java.lang.InterruptedException;Code:0: new #2 // class java/lang/Object3: dup4: invokespecial #1 // Method java/lang/Object.init:()V7: putstatic #3 // Field noLock:Ljava/lang/Object;10: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;13: new #5 // class java/lang/StringBuilder16: dup17: invokespecial #6 // Method java/lang/StringBuilder.init:()V20: ldc #7 // String 线程[22: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;25: invokestatic #9 // Method java/lang/Thread.currentThread:()Ljava/lang/Thread;28: invokevirtual #10 // Method java/lang/Thread.getName:()Ljava/lang/String;31: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;34: ldc #11 // String ]:无锁状态对象布局:36: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;39: getstatic #3 // Field noLock:Ljava/lang/Object;42: invokestatic #12 // Method org/openjdk/jol/info/ClassLayout.parseInstance:(Ljava/lang/Object;)Lorg/openjdk/jol/info/ClassLayout;45: invokevirtual #13 // Method org/openjdk/jol/info/ClassLayout.toPrintable:()Ljava/lang/String;48: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;51: invokevirtual #14 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;54: invokevirtual #15 // Method java/io/PrintStream.print:(Ljava/lang/String;)V57: ldc2_w #16 // long 5000l60: invokestatic #18 // Method java/lang/Thread.sleep:(J)V63: new #2 // class java/lang/Object66: dup67: invokespecial #1 // Method java/lang/Object.init:()V70: putstatic #19 // Field biaseLock:Ljava/lang/Object;73: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;76: new #5 // class java/lang/StringBuilder79: dup80: invokespecial #6 // Method java/lang/StringBuilder.init:()V83: ldc #7 // String 线程[85: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;88: invokestatic #9 // Method java/lang/Thread.currentThread:()Ljava/lang/Thread;91: invokevirtual #10 // Method java/lang/Thread.getName:()Ljava/lang/String;94: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;97: ldc #20 // String ]:偏向锁状态对象布局:99: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;102: getstatic #19 // Field biaseLock:Ljava/lang/Object;105: invokestatic #12 // Method org/openjdk/jol/info/ClassLayout.parseInstance:(Ljava/lang/Object;)Lorg/openjdk/jol/info/ClassLayout;108: invokevirtual #13 // Method org/openjdk/jol/info/ClassLayout.toPrintable:()Ljava/lang/String;111: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;114: invokevirtual #14 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;117: invokevirtual #21 // Method java/io/PrintStream.println:(Ljava/lang/String;)V120: new #2 // class java/lang/Object123: dup124: invokespecial #1 // Method java/lang/Object.init:()V127: putstatic #22 // Field lightLock:Ljava/lang/Object;130: getstatic #22 // Field lightLock:Ljava/lang/Object;133: dup134: astore_1135: monitorenter136: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;139: new #5 // class java/lang/StringBuilder142: dup143: invokespecial #6 // Method java/lang/StringBuilder.init:()V146: ldc #7 // String 线程[148: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;151: invokestatic #9 // Method java/lang/Thread.currentThread:()Ljava/lang/Thread;154: invokevirtual #10 // Method java/lang/Thread.getName:()Ljava/lang/String;157: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;160: ldc #23 // String ]:[轻量级锁提前加偏向锁]轻量级锁状态对象布局:162: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;165: getstatic #22 // Field lightLock:Ljava/lang/Object;168: invokestatic #12 // Method org/openjdk/jol/info/ClassLayout.parseInstance:(Ljava/lang/Object;)Lorg/openjdk/jol/info/ClassLayout;171: invokevirtual #13 // Method org/openjdk/jol/info/ClassLayout.toPrintable:()Ljava/lang/String;174: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;177: invokevirtual #14 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;180: invokevirtual #21 // Method java/io/PrintStream.println:(Ljava/lang/String;)V183: aload_1184: monitorexit185: goto 193188: astore_2189: aload_1190: monitorexit191: aload_2192: athrow193: invokestatic #24 // Method synLight:()V196: new #2 // class java/lang/Object199: dup200: invokespecial #1 // Method java/lang/Object.init:()V203: putstatic #25 // Field heavyLock:Ljava/lang/Object;206: invokestatic #26 // Method synHeavy:()V209: returnException table:from to target type136 185 188 any188 191 188 anypublic static void synLight() throws java.lang.InterruptedException;Code:0: iconst_01: istore_02: iload_03: iconst_14: if_icmpge 167: invokestatic #27 // Method getLightLock:()V10: iinc 0, 113: goto 216: returnpublic static void getLightLock();Code:0: new #28 // class java/lang/Thread3: dup4: invokedynamic #29, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;9: invokespecial #30 // Method java/lang/Thread.init:(Ljava/lang/Runnable;)V12: invokevirtual #31 // Method java/lang/Thread.start:()V15: returnpublic static void synHeavy() throws java.lang.InterruptedException;Code:0: iconst_01: istore_02: iload_03: iconst_24: if_icmpge 167: invokestatic #32 // Method getHeavyLock:()V10: iinc 0, 113: goto 216: return } 4.  总结 有很多文章对 synchronize 分析过我这里只是想使用代码演示一下各种场景很多地方并没有深入到源码和原理层面。 简单来说就是 无锁mark word 记录 hashcode和分代年龄。 单线程加锁偏向锁mark word 记录线程id。 偏向锁升级到 轻量级锁mark word 值 替换为 当前线程栈中的lock record 的指针。 轻量级锁到重量级锁mark word 值 重量级锁 的指针。 其中自旋锁是 轻量级锁到重量级锁 发生的 用CAS操作尝试把对象的Mark Word更新为指向Lock Record的指针如果成功了就是轻量级锁失败了就变成重量级锁。
http://www.pierceye.com/news/842272/

相关文章:

  • 网站开发所需技能外链网
  • 广州做家教的网站临沂哪里有做网站
  • 网站建设介绍会发言稿网站开发主页
  • 做推广赚钱的网站如何制作网站策划书
  • 微信公众号商城网站开发能不能不用虚拟主机建设网站
  • iis 网站目录权限vps网站无法通过ip访问
  • 重庆关键词优化咸阳seo培训
  • 专业网站建设分类标准嘉兴网络项目建站公司
  • 做婚礼网站的公司简介网页打不开怎么办页面无法显示
  • 怎么套用模板做网站白嫖二级域名
  • 网站如何进行备案建立平台的步骤
  • 济南免费网站建设网站用什么软件编写
  • 网站如何注册微信公众平台 类型站长要维护网站
  • 美食类网站模板有的网站为什么打不开怎么回事
  • 平面设计网站导航1万元可以注册公司吗
  • 做网站接口多少钱怎样做旅游网站
  • dw制作旅游网站教程天津市区县档案部门网站建设指导意见
  • 关于网站建设的大学pinthis wordpress
  • 济宁 做网站企业做外贸网站常用术语
  • 国内优秀的设计网站推荐网页设计工作室赚钱吗
  • 商汇通网站广州白云学校网站建设
  • 茶叶企业建设网站php网站开发基础
  • 深圳网站建设 猴王网络地方信息网站源码
  • 微网站后台内容设置erp系统定制
  • 图片点击切换网站模板网站开发 北京外包公司
  • 网站正在建设中 免费东莞手机网站设计公司
  • 旅游网站开发成本包括企业管理控制系统
  • 青浦做网站中美最新局势分析
  • 高端网站建设公司哪家公司好有关网站开发的知识
  • 西宁做网站_君博示范cpa做电影网站侵权吗