java并发编程之Monitor、无锁、偏向锁、轻量级锁和重量级锁

本文详细介绍了Java并发编程中的Monitor概念,包括无锁、偏向锁、轻量级锁和重量级锁的工作原理。Monitor是Java对象内置的锁机制,用于线程同步。在Java 1.6后,synchronized关键字进行了优化,引入了偏向锁、轻量级锁以减少锁的开销。当锁存在竞争时,会从偏向锁升级到轻量级锁,进一步升级到重量级锁。自旋锁作为一种优化手段,在锁持有时间短的情况下可以避免线程挂起,提高性能。
摘要由CSDN通过智能技术生成

一、Monitor

在理解monitor之前,先来了解一下Java对象头:

对象头

对象头是java中对象都具有的属性,是jvm在编译和运行阶段读取的信息。对象头包含三个部分:

  • mark word
  • 指针向类的指针
  • 数组的长度(只有数组的对象用到)

以32位虚拟机为例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.概念

Monitor 被翻译为监视器或管程,可以理解为一个同步工具或一种同步机制,通常被描述为一个对象。每一个Java对象就有一把看不见的锁(C语言实现),称为内部锁或者Monitor锁。如果使用 synchronized给对象上锁(重量级)之后,该对象头的Mark Word 中就被设置指向 Monitor 对象的指针

1.monitor结构如下
在这里插入图片描述

Owner: 当前持有monitor的线程
EntryList:等待锁block状态的线程队列
WaitSet:处于wait状态的线程队列,即调用wait()方法的线程

  • 刚开始 Monitor 中 Owner 为 null。
  • 当 Thread-2 执行 synchronized(obj) 就会将 Monitor 的所有者 Owner 置为Thread-2,Monitor中只能有一个 Owner。
  • 在 Thread-2 上锁的过程中,如果 Thread-3,Thread-4,Thread-5 也来执行 synchronized(obj),就会进入EntryList,处于BLOCKED状态。
  • Thread-2 执行完同步代码块的内容,然后唤醒 EntryList 中等待的线程来竞争锁,竞争时是非公平的。
  • 图中 WaitSet 中的 Thread-0,Thread-1 是之前获得过锁,调用了wait()方法的线程。

二、Synchronized 原理

jdk 1.6以前synchronized 关键字只表示重量级锁,1.6之后区分为偏向锁、轻量级锁、重量级锁。

在这里插入图片描述

1.无锁

无锁没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值