美文网首页
07给女朋友讲讲并发编程-Monitor概念

07给女朋友讲讲并发编程-Monitor概念

作者: XueFengDong | 来源:发表于2021-01-04 21:32 被阅读0次

    一、Java对象头

    我们在编写一个Java类,编译后会生成.class文件,当类加载器将class文件加载到JVM时,会产生一个Klass类型的对象(c++),称为类描述元数据,存储在方法区中,即jdk1.8之后的元数据区。当使用new关键字创建对象时,就是根据类描述元数据Klass创建的对象oop,存储在堆中。每个Java对象都有相同的组成部分,就是对象头。

    1.查看对象头的神器

    jol(java object layout) java对象布局。

    • 导入maven依赖:
            <dependency>
                <groupId>org.openjdk.jol</groupId>
                <artifactId>jol-core</artifactId>
                <version>0.14</version>
            </dependency>
    
    • 使用:
      (1)创建一个简单的java类
    public class User {
        
        private String name;
    
        private Integer age;
    
        private boolean sex;
        
    }
    

    (2)输出对象布局信息

        public static void main(String[] args) {
    
            User user = new User();
            
            log.debug("{}", ClassLayout.parseInstance(user).toPrintable());
    
        }
    

    输出结果:

     OFFSET  SIZE                TYPE DESCRIPTION                               VALUE
          0     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)                           4f d7 00 f8 (01001111 11010111 00000000 11111000) (-134162609)
         12     1             boolean User.sex                                  false
         13     3                     (alignment/padding gap)                  
         16     4    java.lang.String User.name                                 null
         20     4   java.lang.Integer User.age                                  null
    Instance size: 24 bytes
    Space losses: 3 bytes internal + 0 bytes external = 3 bytes total
    

    输出结果中类型描述为object header的即为对象头。
    从图上可以看出,对象头所占的内存大小为12byte*8bit=96bit。本人使用的64位的jvm,正常对象头的大小应该是128bit。此处96bit的原因是jdk8版本默认开启了指针压缩,节约内存。如果想关闭指针压缩,可以修改vm参数:

    -XX:-UseCompressedOops
    
    2.对象头内部说明

    我们已知64bit的jvm默认开启指针压缩的情况下,共占用96bit的内存。
    其中64bit为Mark Word,32bit为Klass Word。


    对象头内存图解

    Mark Word的详细结构为:


    Mark Word结构

    二、Monitor的工作原理

    Monitor工作原理
    • 刚开始Monitor中的Owner为null
    • 当Thread-1执行synchronized(obj)时,就会将obj所关联的Monitor中的Owner置为Thread-1,Monitor中只能有一个Owner
    • 在Thread-1为Owner的过程中,Thread-2、Thread-3、Thread-4也来执行synchronized(obj),就会进入Monitor的EntryList中,变成BLOCKED状态
    • 当Thread-1执行完同步代码块中的代码时,会唤醒EntryList中等待的线程来竞争锁,竞争是非公平的
      注:
    • synchronized必须是进入同一个对象的monitor才会有上述效果
    • 不加synchronized的对象不会关联monitor监视器,不会遵从上述原则

    相关文章

      网友评论

          本文标题:07给女朋友讲讲并发编程-Monitor概念

          本文链接:https://www.haomeiwen.com/subject/lvupoktx.html