JAVA基础: synchronized 和 lock的区别、synchronized锁机制与升级

news2024/11/19 20:25:24

1 synchronized 和 lock的区别

  1. synchronized是一个关键字, lock是一个接口,实际使用的是实现类

  2. synchronized通过触发的是系统级别的锁机制, lock是API级别的锁机制

    synchronized自动获得锁,自动释放锁。 lock需要通过方法获得锁并释放锁

  3. synchronized可以修饰代码段和方法,lock只能修饰代码中

  4. synchronized无法判断是否获得锁,lock可以通过tryLock判断

  5. synchronized一旦阻塞无法中断,lock可以被中断 lock.lockInterruptibly();等待并可以被中断

  6. synchronized一旦出现死锁无法自动解决,lock出现死锁后自动解除

  7. synchronized锁的形式单一, lock锁的形式多样化(可重入锁,排他锁,共享锁,读写锁,公平锁,非公平锁)

  8. synchronized早先属于重量级锁,性能较低。 lock相比之下性能略高

main(){
    A a = new A();
    //问题是:在线程1调用t1方法,睡眠的10秒中,线程2和线程3和线程4能否执行?
    new Thread(()->{a.t1()});
    new Thread(()->{a.t2()});
    new Thread(()->{a.t3()});
    new Thread(()->{a.t4()});
    new Thread(()->{a.t5()});
}

class A{
    public synchronized void t1(){ //睡眠了10s中 }
    public synchronized void t2(){}
    public void t3(){}
    public synchronized static void t4(){} //静态方法,属于类(模板对象 Class)
    public void t5(){
        synchronized(this.getClass()){}
    }    
}

2 synchronized详解

2.1 用户态与内核态

  • 可以理解成是两种对系统元件不同的访问权限

  • 程序运行时,会用到很多系统的元件。

  • 不是所有的元件,所有的程序都具有使用权限

  • 有些元件普通程序(Java程序)就可以直接访问,此时我们就说程序处于用户态

  • 有些元件普通不能直接访问,需要通过系统帮助访问(CPU, IO等),此时我们就说程序处于内核态

  • 我们的在运行的过程中,随着需要使用的系统元件不同,有可能会从用户态切换到内核态

  • 用户态与内核态的切换需要耗时,耗资源。

2.2 用户线程 与 内核线程

  • 系统有自己的线程,称为内核线程

  • 我们使用Java语言创建的线程(Thread),称为用户线程

  • 内核线程的数量与系统的cpu数量(逻辑处理器数量)是相同

  • 用户线程在执行过程中,不是直接抢占CPU,而是要争抢与内核线程的关联(映射)

  • 如果创建的用户线程过多, 多个用户线程会映射到一个内核线程上

  • 但一个内核线程每次(一个时间片)只能为一个用户线程执行任务

  • 所以当内核线程在多个用户线程之间切换时,需要保留上一个线程执行的相关信息

  • 我们称这个过程为上下文切换

  • 上下文切换耗时,耗资源

2.3 synchronized重量级锁

  • synchronized在上锁时,最终使用的是系统级别的mutex互斥锁(排他锁)

  • 使用synchronized上锁时,会存在用户态与内核态的切换,性能较低。

  • 我们称这种会涉及到系统资源使用的锁,为重量级锁。

  • jdk1.5 推出JUC之后, lock锁在一定程度上,减缓了重量级的性能消耗

  • lock锁在整个锁应用过程中,有一部分是在用户态完成的,少量在内核态完成。

  • 所以lock在整体性能上要优于synchronized锁。

2.4 synchronized锁升级

  • 早先版本(1.6-) , synchronized属于重量级锁,因为他直接使用系统级别的互斥锁

  • 所以1.5版本的juc中,lock对于synchronized有所优化

  • 1.6 直接对synchronized做了优化 , 提供了锁升级的机制

  • 升级过程

  • 注意:无论锁怎么样升级降级,对我们的编码没有影响。

  • 可以利用JOL工具 和 对对象头结构的理解来测试锁升级的过程

  • 创建对象时,在jvm堆内存中会开辟存储空间。这个对象空间也有一定的结构

    • 部分一: 对象头

      1. mark word 标记内容 ,其中包括锁标记,随着锁升级,锁标记也会变化

      2. Klass 指向类模板

    • 部分二: 属性数据空间

    • 部分三: 数据对齐

    • 扩展:如果是数组对象,还有部分四,length属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2199959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的校园教务系统的设计与实现(论文+源码)_kaic

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对校园教务信息管理混乱,出错率高,信息安全性差…

【含开题报告+文档+PPT+源码】基于SSM框架的民宿酒店预定系统的设计与实现

开题报告 随着人们旅游需求的增加,民宿行业呈现出快速发展的趋势。传统的住宿方式逐渐无法满足人们对个性化、舒适、便捷的需求,而民宿作为一种新型的住宿选择,逐渐受到人们的青睐。民宿的特点是具有独特的风格、便捷的地理位置、相对亲近的…

基于yolov8的版面分析AI能力生产全流程

目录 1.coco数据集 1.1 基本定义 1.2应用场景 1.3 数据结构 2.labelme标注工具 2.1 基本定义 2.2 应用场景 2.3 安装步骤 3. 模型训练 3.1 数据标注 3.2 环境准备 3.3 数据预处理 3.4 模型训练 3.5 模型推理 4.参考链接 1.coco数据集 1.1 基本定…

数据库的相关知识

数据库的相关知识 1.数据库能够做什么? 存储大量数据,方便检索和访问保持数据信息的一致、完整共享和安全通过组合分析,产生新的有用信息 2.数据库作用? 存储数据、检索数据、生成新的数据 3.数据库要求? 统一、…

51单片机的自动洗手器【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机红外传感器继电器LED等模块构成。适用于红外感应洗手器、自动出水等相似项目。 可实现功能: 1、红外传感器实时采集人体信息,如果有人靠近,则闭合水泵继电器开始出水,人离开5s后,继电…

微信5大隐藏技巧,让你成为聊天高手

微信,这个几乎人人都在使用的应用,它的一些隐藏功能却鲜为人知。 今天,就让我们一起来探索这些实用的小技巧,让你的微信使用体验更上一层楼。 一键长截图,保存完整信息 在微信里,当你需要截取某个网页或公…

JAVA八股文1

1.Java 基础 1.1 语法基础 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内…

【算法】链表:2.两数相加(medium)+模拟

系列专栏 《分治》 《模拟》 《Linux》 目录 1、题目链接 2、题目介绍 3、解法 (模拟) 4、代码 1、题目链接 2. 两数相加 - 力扣(LeetCode) 2、题目介绍 3、解法 (模拟) 理解题目要求: 我们有两个链表,每个链表代表一个…

完成Sentinel-Dashboard控制台数据的持久化-同步到Nacos

本次案例采用的是Sentinel1.8.8版本 一、Sentinel源码环境搭建 1、下载Sentinel源码工程 git clone https://github.com/alibaba/Sentinel.git 2、导入到idea 这里可以先运行DashboardApplication.java试一下是否运行成功,若成功,源码环境搭建完毕&a…

华为OD机试 - 最长广播响应 - 广度优先搜索(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

计算机视觉学习笔记--高斯金字塔,DoG金字塔和拉普拉斯金字塔附带代码

尺度空间和图像金字塔 尺度并非指图像的大小,而是指图像的模糊程度,从近距离到远距离图像越来越模糊的过程,也是图像的尺度越来越大的过程。尺度空间是图像在不同尺度下的连续表示。其中最常见的是使用高斯核对图像进行卷积。随着高斯滤波核…

网格剖分-耳切法效果展示

1.前言 将简单多边形转换成一组由同样顶点组成的三角形集合是计算机图形学中的一个经典问题。问题中,简单多边形是指由一组有序顶点组成的,点V0~点Vn-1。相邻的顶点之间通过边(Vi,Vi-1)连接,并且边(Vn-1,V0)连接起始点…

换毛季来临,铲屎官如何应对猫咪掉毛?宠物空气净化器该怎么选?

养猫前,我是潇洒自如的单身汉;养猫后,我就是勤恳辛劳的保姆!每天下班还要“伺候”猫孩子,收拾它一天在家掉落的猫毛。虽说我没有洁癖,但换毛季可不是开玩笑的,稍微偷懒几天没有清理,…

C++竞赛初阶—— 石头剪子布

题目内容 石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比…

苹果开发者网站iOS应用创建全流程详解

引言 在当今的移动开发领域,uni-app 和 Flutter 等跨平台开发工具为开发者提供了便利,可以一次编写代码并部署到多个平台。然而,尽管这些工具简化了应用的开发过程,但它们在iOS应用的构建和发布环节往往并不涉及太多。对于希望在…

上传本地项目到GitHub远程仓库(极简洁操作版)

第一步:在GitHub创建一个空的仓库 第二步:将仓库克隆(下载)到本地 第三步:将你要上传的所有文件放到这个克隆的仓库文件夹中 第四步:通过git add .将待上传文件添加到暂存区 此时,可以通过git …

网际报文协议ICMP及ICMP重定向实例详解5

之前在一个项目中遇到了与ICMP重定向相关的问题,因为缺乏对ICMP相关内容的了解,排查了很长一段时间才查出来。本文给大家简要地介绍一下ICMP及ICMP重定向相关的内容。 1、ICMP的概念 ICMP(Internet Control Message Protocol)网际…

156-反溯源隐藏C2项目域前置云函数数据中转DNS转发

演示案例: CS-隐藏防朔源-域前置-C2&CDN CS-隐藏防朔源-云函数-C2&API 触发 CS-隐藏防朔源-DNS 解析-C2&流量伪装 CS-隐藏防朔源-数据转发-C2&Iptables&中间件 接上节课的知识点,上节课只讲了利用CDN进行隐藏的方式 #域前置-CDN 配合…

每日一练:分割回文串Ⅳ

1745. 分割回文串 IV - 力扣(LeetCode) 题目要求: 给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false 。 当一个字符串正着读和反着读是一模一样的&#xff0…

Win32 API 控制台鼠标操作、坐标获取与相关函数介绍

Win32 API 控制台鼠标操作、坐标获取与相关函数介绍 一、前置介绍读取控制台输入缓冲区数据 ReadConsoleInput 函数控制台输入缓冲区中的输入事件 INPUT_RECORD 结构鼠标输入事件 MOUSE_EVENT_RECORD 结构更改输入模式 SetConsoleMode 函数 二、鼠标坐标获取(以下代码环境为 VS…