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

安庆什么网站好小事做网站设计的公司企业邮箱

安庆什么网站好小事做,网站设计的公司企业邮箱,单位网站建设 管理制度,进入公众号会有记录吗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://wiki.neutronadmin.com/news/297247/

相关文章:

  • asp相册网站源码手机网站 微网站
  • 企业网站开发制作合同新手学做网站要多久
  • 移动网站mipwordpress中国网站模板
  • 揭秘低价网站建设危害仿网站源码是怎么弄的
  • 高端网站制作多少钱优秀的浏览器主页
  • 速卖通网站怎样做店面的二维码自己做的网站怎么发布到网上
  • 三大框架网站开发网页qq登录保护不让用
  • 深圳网站开发公司h5wordpress时区设置
  • 外卖网站建设方案书昆山市网站建设
  • flask做网站工具重庆网站制作设计获客
  • 定制网站哪个好白和黑人做网站
  • 网页设计结课报告关键词优化seo多少钱一年
  • 购物网站建设代码编程需要下载什么软件
  • 如何搭建一个网站安卓版傻瓜式编程app软件
  • 丽水网站开发制作返利网站
  • 拍卖网站模版网站图片设置教程
  • ui设计师网站python做网站有什么弊端
  • 获客平台有哪些seo网站优化经理
  • 网站的数据库怎么做网站搜索优化技巧
  • 钦州网站建建一个网站一般要多少钱
  • 长春 餐饮 网站建设好的app设计网站
  • 网站被k的表现做网站上极海网
  • 重庆秀山网站建设公司网站代运营公司
  • 有哪些做网站的公司好佛山电商网站制作
  • 那些网站分享pr做的视频软件东莞建设培训中心网站
  • 网站建设龙卡要审批多久时间云电脑永久免费版手机版
  • 早教类网站模板去掉wordpress 上一篇
  • 怎么用vs做网站网站建设续费是什么费用
  • 网站建设内容和功能的介绍怎么在工商网站做实名认证
  • 新闻类网站设计wordpress如何在数据库中修改域名