网易首页 > 网易号 > 正文 申请入驻

揭秘Java锁机制:从Mark Word到ObjectMonitor的同步奥秘

0
分享至

揭秘Java锁机制:从Mark Word到ObjectMonitor的同步奥秘

在多线程编程中,确保线程安全是至关重要的。Java虚拟机(JVM)通过一套精巧的锁机制,实现了高效的线程同步。今天,我们就来揭开Java锁机制的神秘面纱,从Mark WordObjectMonitor,看看它们是如何协同工作,保护我们的数据安全的。

一、Java锁机制概述

在Java中,锁机制主要用于确保线程安全,防止多个线程同时访问共享资源导致的数据竞争。JVM提供了多种锁机制,按照重量级从轻到重依次为:偏向锁轻量级锁重量级锁。此外,锁还可以分为公平锁非公平锁,它们决定了线程获取锁的顺序。

  • 偏向锁:适用于单一线程频繁访问的场景,通过记录线程ID实现高效同步。

  • 轻量级锁:适用于线程竞争不激烈的场景,通过自旋等待避免线程阻塞。

  • 重量级锁:适用于线程竞争激烈的场景,通过操作系统监视器实现线程同步。

  • 公平锁:按照线程请求锁的顺序分配锁,保证先到先得。

  • 非公平锁:不保证线程请求锁的顺序,可能允许插队,以提高吞吐量。

二、Mark Word:对象头的同步密码

Mark Word是对象头(Object Header)中的关键字段,用于存储对象的运行时元数据。它是实现轻量级锁和偏向锁的核心数据结构。

1. Mark Word的结构

Mark Word是一个32位或64位的字段,具体结构取决于JVM的实现和对象的状态。常见的字段包括:

  • 锁状态标志:标识锁的状态(无锁、偏向锁、轻量级锁、重量级锁)。

  • 偏向线程ID:存储偏向锁的线程ID(仅在偏向锁状态下有效)。

  • 哈希码:存储对象的哈希码(在未加锁状态下有效)。

  • 指向锁记录的指针:存储指向栈帧中锁记录的指针(在轻量级锁状态下有效)。

  • 指向监视器的指针:存储指向操作系统监视器的指针(在重量级锁状态下有效)。

2. Mark Word在不同锁状态下的变化
  • 无锁状态:存储对象的哈希码和分代年龄。

  • 偏向锁状态:存储偏向线程ID和分代年龄。

  • 轻量级锁状态:存储指向锁记录的指针和锁状态标志。

  • 重量级锁状态:存储指向监视器的指针和锁状态标志。

三、ObjectMonitor:重量级锁的守护者

ObjectMonitor是JVM中用于实现重量级锁的核心数据结构,它通过操作系统提供的监视器(Monitor)机制实现线程同步。

1. ObjectMonitor的结构

ObjectMonitor包含多个字段,用于管理线程的等待队列、锁计数器、拥有锁的线程等信息。常见的字段包括:

  • _owner:当前拥有锁的线程。

  • _EntryList:等待获取锁的线程队列。

  • _cxq:竞争队列,用于管理新加入的等待线程。

  • _recursions:锁的重入计数器。

  • _Responsible:最后一个成功获取锁的线程。

  • _SpinDuration:自旋等待的时间阈值。

2. ObjectMonitor的工作流程
  • 获取锁

  1. 检查_owner字段,如果锁未被持有,线程获取锁并更新_owner。

  2. 如果锁已被持有,线程进入_cxq队列自旋等待。

  3. 自旋超时后,线程转移到_EntryList队列并进入阻塞状态。

释放锁

  1. 更新_owner字段为null。

  2. 唤醒_EntryList队列中的一个线程,尝试获取锁。

⚖️四、公平锁与非公平锁:权衡吞吐量与公平性

在Java中,锁可以分为公平锁和非公平锁,它们决定了线程获取锁的顺序。

1. 公平锁

  • 概念:按照线程请求锁的顺序分配锁,保证先到先得。

  • 实现方式:通过维护一个有序的等待队列,确保线程按请求顺序获取锁。

  • 优点:避免线程饥饿,保证公平性。

  • 缺点:吞吐量较低,因为每次释放锁后都需要唤醒队列中的第一个线程。

  • 应用场景:适用于对线程公平性要求高的场景,如订单处理系统。

2. 非公平锁
  • 概念:不保证线程请求锁的顺序,可能允许插队,以提高吞吐量。

  • 实现方式:允许线程在释放锁时直接尝试获取锁,而不必进入等待队列。

  • 优点:吞吐量高,因为线程可以更快地获取锁。

  • 缺点:可能导致线程饥饿,某些线程可能长时间无法获取锁。

  • 应用场景:适用于对吞吐量要求高的场景,如实时数据处理系统。

3. Java中的实现
  • ReentrantLock:支持公平锁和非公平锁的选择,通过构造函数参数指定。

  • synchronized关键字:默认使用非公平锁,但可以通过JVM参数调整。

五、代码示例1. 公平锁与非公平锁示例

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class FairLockDemo {
    // 非公平锁
    private static Lock nonFairLock = new ReentrantLock();
    // 公平锁
    private static Lock fairLock = new ReentrantLock(true);

    public static void main(String[] args) {
        // 非公平锁示例
        new Thread(() -> {
            nonFairLock.lock();
            try {
                System.out.println("非公平锁获取成功");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                nonFairLock.unlock();
            }
        }).start();

        // 公平锁示例
        new Thread(() -> {
            fairLock.lock();
            try {
                System.out.println("公平锁获取成功");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                fairLock.unlock();
            }
        }).start();
    }
}
2. 偏向锁、轻量级锁、重量级锁示例

public class LockTypeDemo {
    private static Object lock = new Object();

    public static void main(String[] args) {
        // 偏向锁示例(单一线程频繁访问)
        new Thread(() -> {
            synchronized (lock) {
                System.out.println("偏向锁示例");
            }
        }).start();

        // 轻量级锁示例(线程竞争不激烈)
        new Thread(() -> {
            synchronized (lock) {
                System.out.println("轻量级锁示例");
            }
        }).start();

        // 重量级锁示例(线程竞争激烈)
        new Thread(() -> {
            synchronized (lock) {
                try {
                    Thread.sleep(1000);
                    System.out.println("重量级锁示例");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
六、Java锁机制的优势
  • 减少资源消耗:通过偏向锁和轻量级锁,避免不必要的资源竞争。

  • 提升并发性能:通过自旋等待和自适应优化,提高并发效率。

  • 灵活适应场景:根据线程竞争情况,动态调整锁的实现方式。

  • 权衡吞吐量与公平性:通过公平锁和非公平锁的选择,满足不同场景的需求。

总结

Java锁机制通过Mark WordObjectMonitor的协同工作,实现了高效、灵活的线程同步。无论是偏向锁、轻量级锁还是重量级锁,都是为了确保多线程环境下的数据一致性。而公平锁和非公平锁的选择,则让我们能够在吞吐量和公平性之间做出权衡。随着技术的发展,Java锁机制将不断优化和完善,为开发者提供更加安全、高效的并发编程支持。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
Seedance 2.0全面接入豆包:暂不支持参考图输入,限制真人图像和视频作为主体参考

Seedance 2.0全面接入豆包:暂不支持参考图输入,限制真人图像和视频作为主体参考

每日经济新闻
2026-02-12 20:14:30
马竞4-0巴萨,赛后评分:不是亚马尔第一,马竞16号排第一

马竞4-0巴萨,赛后评分:不是亚马尔第一,马竞16号排第一

侧身凌空斩
2026-02-13 06:11:03
67亿甩卖公司!小杨哥这次玩大了

67亿甩卖公司!小杨哥这次玩大了

李东阳朋友圈
2026-02-12 08:41:48
美司法部提起诉状,要求强制中国随锐集团从收购的美国丘比特系统公司撤资

美司法部提起诉状,要求强制中国随锐集团从收购的美国丘比特系统公司撤资

俄罗斯卫星通讯社
2026-02-12 15:07:34
蜜月期刚过就翻脸?一夜之间税费暴涨85%,这回俄罗斯是真把中国车企逼到了墙角

蜜月期刚过就翻脸?一夜之间税费暴涨85%,这回俄罗斯是真把中国车企逼到了墙角

历史回忆室
2026-02-13 00:39:13
抗日战争最惨战役之一,日本伤亡20余万精锐部队,极度解气的一战

抗日战争最惨战役之一,日本伤亡20余万精锐部队,极度解气的一战

云霄纪史观
2026-02-11 19:10:07
93年毛远新出狱,看到长相出众的女儿很欣慰,得知残疾又泣不成声

93年毛远新出狱,看到长相出众的女儿很欣慰,得知残疾又泣不成声

雍亲王府
2026-02-08 18:15:07
花1580买的“永久”服务,5年后100块没人要!厂家套路太深了!

花1580买的“永久”服务,5年后100块没人要!厂家套路太深了!

沙雕小琳琳
2026-02-12 00:32:34
上海嘉闵线施工区域再次发生塌陷,申通地铁独家回应:无人员伤亡

上海嘉闵线施工区域再次发生塌陷,申通地铁独家回应:无人员伤亡

贝壳财经
2026-02-12 16:59:03
回顾:安徽26岁农妇害死17岁男孩,逃亡16年,落网时是公司高管

回顾:安徽26岁农妇害死17岁男孩,逃亡16年,落网时是公司高管

谈史论天地
2026-01-21 16:05:02
阿尔特塔:我们必须正视自己的表现,有些环节本可以做得更好

阿尔特塔:我们必须正视自己的表现,有些环节本可以做得更好

懂球帝
2026-02-13 07:59:31
爆大冷!马竞踢疯了,4球横扫巴萨,弗里克不敢相信

爆大冷!马竞踢疯了,4球横扫巴萨,弗里克不敢相信

足球狗说
2026-02-13 06:02:28
湖北女子感染HPV,回家过年的第一批“受害者”出现了……

湖北女子感染HPV,回家过年的第一批“受害者”出现了……

桌子的生活观
2026-02-12 01:15:30
杨幂争夺C位风波升级,后排窃窃私语者成焦点,王安宇最为凄凉

杨幂争夺C位风波升级,后排窃窃私语者成焦点,王安宇最为凄凉

一盅情怀
2026-02-12 12:29:43
第8艘!美军追了整整半个地球,在印度洋抓捕中国香港油轮

第8艘!美军追了整整半个地球,在印度洋抓捕中国香港油轮

瞩望云霄
2026-02-11 19:17:35
征服中年女人,无需套路:两颗真心,一生相守

征服中年女人,无需套路:两颗真心,一生相守

青苹果sht
2025-11-04 06:10:40
韩媒挑拨离间:整个欧洲都震怒了,中国速滑运动员犯规还倒打一耙

韩媒挑拨离间:整个欧洲都震怒了,中国速滑运动员犯规还倒打一耙

杨华评论
2026-02-12 15:12:39
眼镜妹为何是花探系列里面人气第一女主?敬业并把工作当爱好

眼镜妹为何是花探系列里面人气第一女主?敬业并把工作当爱好

挪威森林
2026-02-11 12:09:26
郭德纲没想到,封箱演出这晚郭麒麟用9个字,让德云社口碑翻盘了

郭德纲没想到,封箱演出这晚郭麒麟用9个字,让德云社口碑翻盘了

白面书誏
2026-02-12 14:35:14
首付300万跌没了!北京大厂码农梦碎:失业、拒签、负资产

首付300万跌没了!北京大厂码农梦碎:失业、拒签、负资产

石辰搞笑日常
2026-02-12 09:22:35
2026-02-13 08:32:49
君伟说
君伟说
分享职场故事
373文章数 48关注度
往期回顾 全部

科技要闻

于东来的两次告别背后:创始人为何总是“退而不休”

头条要闻

中方提出要求 立陶宛新总理"认错":能改

头条要闻

中方提出要求 立陶宛新总理"认错":能改

体育要闻

31岁首次参加冬奥,10年前她是个水管工

娱乐要闻

《惊蛰无声》违规抢占排片遭影院控诉

财经要闻

“影子万科”如何掘金万科?

汽车要闻

开212 T01柴油版去穿越 连牧马人都跟不上

态度原创

教育
时尚
旅游
手机
亲子

教育要闻

比港三还要竞争激烈的几所英国大学!

50+女人怎么穿更好看?过来人告诉你答案,越老越美赢麻了

旅游要闻

读懂“盼回复”蕴含的期盼

手机要闻

三星Galaxy S26+芯片有别,2月26日发布会见分晓!

亲子要闻

孩子最渴望听到父母说的五句话

无障碍浏览 进入关怀版