打印Mark Work信息
//引入工具包依赖
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.8</version>
</dependency>
//示例代码
@Slf4j
public class MonitorDemo {
static Object monitor = new Object();
public static void main(String[] args) {
defaultLock();
// lock2();
}
public static void lock2(){
new Thread(() -> {
synchronized (monitor){
try {
print(monitor);
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
//存在锁竞争,锁膨胀至重量级锁
synchronized (monitor){
print(monitor);
}
}).start();
}
/**
* VM参数:-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0
* 使JVM不延迟加载偏向锁,默认是延迟几秒的,因为JVM初始化期间存在大量的同步方法,锁升级会严重影响性能
*/
public static void defaultLock(){
//打印初始的Mark Work
print(monitor);
synchronized (monitor){
//偏向锁
log.info("locking...");
print(monitor);
}
//锁释放
print(monitor);
new Thread(() -> {
//更新偏向锁获得者的线程ID
synchronized (monitor){
log.info("locking 2 ...");
print(monitor);
}
}).start();
// 计算hashcode,Mark Work中的线程ID位置被占用,偏向锁永久撤销
System.out.println(monitor.hashCode());
print(monitor);
//锁升级至轻量级锁
synchronized (monitor){
log.info("locking...");
print(monitor);
}
}
public static void print(Object monitor){
log.info("# # # # # # # # # # # # # # # # # # # # ");
log.info(ClassLayout.parseInstance(monitor).toPrintable());
}
}
Mark Work打印信息