引入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框架