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

北京海淀区居家办公网站功能优化

北京海淀区居家办公,网站功能优化,网页设计岗位职责,wordpress轻博客主题synchronized关键字的使用和原理 synchronized#xff1a;对象锁#xff0c;保证了临界区内代码的原子性#xff0c;采用互斥的方式让同一时刻至多只有一个线程能持有对象锁#xff0c;其它线程获取这个对象锁时会阻塞#xff0c;保证拥有锁的线程可以安全的执行临界区内…synchronized关键字的使用和原理 synchronized对象锁保证了临界区内代码的原子性采用互斥的方式让同一时刻至多只有一个线程能持有对象锁其它线程获取这个对象锁时会阻塞保证拥有锁的线程可以安全的执行临界区内的代码不用担心线程上下文切换。 1、使用方式 锁对象理论上可以是任意的唯一对象 package com.jtc.fe;public class synchronizedDemo {// 同步静态方法 —— 锁住class类对象 —— 全局唯一synchronized public static void func1(){}// 同步方法 —— 锁住实例对象 —— 每个实例都可以当锁synchronized public void func3(){}// 同步代码块public void func2(){// —— 锁住class类对象 —— 全局唯一synchronized (synchronizedDemo.class){}}public void func4(){// —— 锁住实例对象 —— 每个实例都可以当锁synchronized (this){}}public void func5(){// —— 锁住字符串123synchronized (123){}} }注意 synchronized 修饰的方法的不具备继承性所以子类是线程不安全的如果子类的方法也被 synchronized 修饰两个锁对象其实是一把锁而且是子类对象作为锁。 2、锁原理 Java的对象由三部分组成对象头 实例数据 对齐填充。 2.1、对象头 64位对象头由Mark Word、Class Pointer两部分组成如果对象是数组则还要加上数组长度即三部分组成。 Mark Word用于存储对象自身的运行时数据如哈希码HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。由于对象需要存储的运行时数据很多但64位虚拟机给它的空间只有64位Bitmap所以Mark Word被设计成一个有着动态定义的数据结构即不同的锁状态存储内容不同。 如果要查看内存结构图需要引入依赖 dependencygroupIdorg.openjdk.jol/groupIdartifactIdjol-core/artifactIdversion0.9/version /dependencyimport com.example.demo.User; import org.openjdk.jol.info.ClassLayout;public class p6 {static User user new User();static User[] users new User[10];public static void main(String[] args) {System.out.println(ClassLayout.parseInstance(user).toPrintable());System.out.println(*******************************************);System.out.println(ClassLayout.parseInstance(users).toPrintable());} }Mark Word由64位8个字节组成。Class Pointer由64位8个字节组成但我们使用的64位 JVM会默认使用选项 UseCompressedOops 开启指针压缩将指针压缩至32位。即上面截图中的Class Pointer为4个字节32位。 如果在打印对象头前调用HashCode方法则会变成如下 从MarkWord的结构可以看出在无锁阶段内存分布与上图是一一对应的HashCode也是一一对应的。 2.2、锁升级 synchronized 是可重入、不公平的重量级锁所以可以对其进行优化。 无锁 - 偏向锁 - 轻量级锁 - 重量级锁 // 随着竞争的增加只能锁升级不能降级 其中重量级锁还需要Monitor对象配合使用偏向锁 偏向锁的思想是偏向于让第一个获取锁对象的线程这个线程之后重新获取该锁不再需要同步操作当锁对象第一次被线程获得的时候进入偏向状态使用 CAS 操作将线程 ID 记录到 Mark Word。 轻量级锁 当有另外一个线程去尝试获取这个锁对象时偏向状态就宣告结束此时撤销偏向Revoke Bias后恢复到未锁定或轻量级锁状态。一个对象有多个线程要加锁但加锁的时间是错开的没有竞争可以使用轻量级锁来优化轻量级锁对使用者是透明的不可见。 重量级锁 在尝试加轻量级锁的过程中CAS 操作无法成功可能是其它线程为此对象加上了轻量级锁有竞争这时需要进行锁膨胀将轻量级锁变为重量级锁。 在重量级锁阶段每个 Java 对象都可以关联一个 Monitor 对象Monitor 也是 class其实例存储在堆中如果使用 synchronized 给对象上锁之后该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针这就是重量级锁。 工作流程 开始时 Monitor 中 Owner 为 null 当 Thread-2 执行 synchronized(obj) 就会将 Monitor 的所有者 Owner 置为 Thread-2Monitor 中只能有一个 Ownerobj 对象的 Mark Word 指向 Monitor把对象原有的 MarkWord 存入线程栈中的锁记录中 在 Thread-2 上锁的过程Thread-3、Thread-4、Thread-5 也执行 synchronized(obj)就会进入 EntryList BLOCKED双向链表 Thread-2 执行完同步代码块的内容根据 obj 对象头中 Monitor 地址寻找设置 Owner 为空把线程栈的锁记录中的对象头的值设置回 MarkWord 唤醒 EntryList 中等待的线程来竞争锁竞争是非公平的如果这时有新的线程想要获取锁可能直接就抢占到了阻塞队列的线程就会继续阻塞 WaitSet 中的 Thread-0是以前获得过锁但条件不满足进入 WAITING 状态的线程wait-notify 机制 2.3、代码字节码 修饰代码段时 public static void main(String[] args) {Object lock new Object();synchronized (lock) {System.out.println(ok);} }0: new #2 // new Object 3: dup 4: invokespecial #1 7: astore_1 8: aload_1 9: dup 10: astore_2 11: monitorenter // 【将 lock对象 MarkWord 置为 Monitor 指针】 12: getstatic #3 15: ldc #4 17: invokevirtual #5 20: aload_2 21: monitorexit // 【将 lock对象 MarkWord 重置, 唤醒 EntryList】 22: goto 30 25: astore_3 26: aload_2 27: monitorexit // 【将 lock对象 MarkWord 重置, 唤醒 EntryList】 28: aload_3 29: athrow 30: return Exception table:from to target type12 22 25 any25 28 25 any LineNumberTable: ... LocalVariableTable:Start Length Slot Name Signature0 31 0 args [Ljava/lang/String;8 23 1 lock Ljava/lang/Object;从上面我们可以看出synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令其中 monitorenter 指令指向同步代码块的开始位置monitorexit 指令则指明同步代码块的结束位置。其中两个 monitorexit 指令是为了保证锁在同步代码块代码正常执行以及出现异常的这两种情况下都能被正确释放。 修饰方法时 public synchronized void method() {System.out.println(synchronized 方法); }JVM 通过该 ACC_SYNCHRONIZED 访问标志来辨别一个方法是否声明为同步方法如果是实例方法JVM 会尝试获取实例对象的锁。如果是静态方法JVM 会尝试获取当前 class 的锁。 总结 synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令修饰方法是 ACC_SYNCHRONIZED 标识。 不过两者的本质都是对对象监视器 Monitor 的获取。 参考https://github.com/Seazean/JavaNote/blob/main/Prog.md https://blog.csdn.net/zhaocuit/article/details/100208879?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170239663116800182715111%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257Drequest_id170239663116800182715111biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2alltop_positive~default-1-100208879-null-null.142v96pc_search_result_base9utm_termjava%E5%AF%B9%E8%B1%A1%E5%A4%B4spm1018.2226.3001.4187
http://www.hkea.cn/news/14311595/

相关文章:

  • 兰州网站的建设网页设计师面试
  • 广州外贸网站建设 open购物网站建设市场调查论文
  • soso网站提交入口国外优秀的字体设计网站
  • 做网站推广的销售电话开场白大连微信公众号开发
  • 企业网站建设中存在的问题分析设计师发布作品的网站
  • 一个好的网站怎么建设网站设计网站开发优化
  • 章丘环保网站建设 中企动力asp.net 怎么做网站
  • 专门做童装的网站有哪些民间it网站建设
  • 网站运营发展前景wordpress代码显示头像
  • 宝安的医院网站建设h56wcom什么网站
  • 软工毕设做网站wordpress 说说 主题
  • 网站里的动效怎么做广东网站建设系统
  • 网站优化哪里可以做网站做网络营销
  • 网站宽度980 在ipad上 左对齐了物流网站的建设实训
  • 中台网站开发江阴做网站哪家好
  • 学网站开发要什么基础短视频运营是做什么的
  • 网站开发与设计实训心得网络科技公司企业简介
  • 做好网站wordpress oyester
  • 厦门关键词seo排名网站企业品牌网站开发制作合同
  • 企业网站视频栏目建设方案flash网站优缺点
  • 用来做微网站的怎么判断网站有没有做百度商桥
  • 青岛建站行业广告词
  • 做网站各个流程做软件去哪个网站
  • jsp网站开发参考文献建设企业网站开发公司
  • 东莞seo整站优化火速公司网站建设合同要交印花税吗
  • 网站建设的展望重庆网站建设齐重庆零臻科技
  • asp.net 网站开发 ppt网络软文推广案例
  • 郑州网站制作哪家便宜物流网站建设案例
  • gofair做网站苏州百度
  • 个人网站开发与实现开题报告wordpress点击文章不能进入