Java的锁机制

2022-11-02 15:27:21 浏览数 (1)

引入jol工具包,它可以把java对象在jvm内存中布局的情况打印出来,看一下对象在jvm中是怎么存在的

代码语言:javascript复制
<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.15</version>
    <scope>provided</scope>
</dependency>

demo代码:

代码语言:javascript复制
package com.example.learningdemo.demo;

import org.openjdk.jol.info.ClassLayout;

/**
 * @author Anzepeng
 * @title: JolDemo
 * @projectName learningdemo
 * @description: TODO
 * @date 2021/4/7 0007下午 15:36
 */
public class JolDemo {

    public static void main(String[] args) {
        Object object = new Object();
        System.err.println(ClassLayout.parseInstance(object).toPrintable());

        synchronized (object) {
            System.err.println(ClassLayout.parseInstance(object).toPrintable());
        }
    }
}

执行结果,java的锁就实在对象的markword中记录的一个锁状态,加锁前和加锁后只有markword发生了改变

锁状态的编码:偏向锁、轻量锁、重量锁对应不同的锁的状态

轻量级锁也叫自旋锁,不会进行线程的挂起,而是一直在自旋查看锁是否被释放

重量级锁是由操作系统进行介入,在锁被使用的时候将其他线程进行阻塞挂起,锁被释放时又进行唤醒竞争,上下线程的切换造成资源的内耗要比轻量级锁多得多

偏向锁默认是不打开的,在阻塞4秒后进行打开

如何保证3个线程同时执行

CountDownLatch、CylicBarrier、Semaphore

如何对字符串进行快速排序

fork/join框架

0 人点赞