打印Mark Work信息

    1. //引入工具包依赖
    2. <dependency>
    3. <groupId>org.openjdk.jol</groupId>
    4. <artifactId>jol-core</artifactId>
    5. <version>0.8</version>
    6. </dependency>
    1. //示例代码
    2. @Slf4j
    3. public class MonitorDemo {
    4. static Object monitor = new Object();
    5. public static void main(String[] args) {
    6. defaultLock();
    7. // lock2();
    8. }
    9. public static void lock2(){
    10. new Thread(() -> {
    11. synchronized (monitor){
    12. try {
    13. print(monitor);
    14. Thread.sleep(5000);
    15. } catch (InterruptedException e) {
    16. e.printStackTrace();
    17. }
    18. }
    19. }).start();
    20. try {
    21. Thread.sleep(3000);
    22. } catch (InterruptedException e) {
    23. e.printStackTrace();
    24. }
    25. new Thread(() -> {
    26. //存在锁竞争,锁膨胀至重量级锁
    27. synchronized (monitor){
    28. print(monitor);
    29. }
    30. }).start();
    31. }
    32. /**
    33. * VM参数:-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0
    34. * 使JVM不延迟加载偏向锁,默认是延迟几秒的,因为JVM初始化期间存在大量的同步方法,锁升级会严重影响性能
    35. */
    36. public static void defaultLock(){
    37. //打印初始的Mark Work
    38. print(monitor);
    39. synchronized (monitor){
    40. //偏向锁
    41. log.info("locking...");
    42. print(monitor);
    43. }
    44. //锁释放
    45. print(monitor);
    46. new Thread(() -> {
    47. //更新偏向锁获得者的线程ID
    48. synchronized (monitor){
    49. log.info("locking 2 ...");
    50. print(monitor);
    51. }
    52. }).start();
    53. // 计算hashcode,Mark Work中的线程ID位置被占用,偏向锁永久撤销
    54. System.out.println(monitor.hashCode());
    55. print(monitor);
    56. //锁升级至轻量级锁
    57. synchronized (monitor){
    58. log.info("locking...");
    59. print(monitor);
    60. }
    61. }
    62. public static void print(Object monitor){
    63. log.info("# # # # # # # # # # # # # # # # # # # # ");
    64. log.info(ClassLayout.parseInstance(monitor).toPrintable());
    65. }
    66. }

    Mark Work打印信息
    image.png