java synchronized lock 原理 对比

Synchronized和lock的原理和区别 一、Synchronized 1、synchronized原理: 1.1、方法级的同步锁 非静态同步方法锁的是当前对象 public class MyLock { public static void main(String[] args) throws InterruptedException { Phone phone = new Phone(); new Thread(()->{ phone.sendEmail(); 阅读详情

在Java中,synchronized关键字和Lock接口(通常通过ReentrantLock实现)都是用来控制并发访问共享资源的机制,但它们在底层实现和特性上有一些不同。下面我们将比较这两种机制的底层原理、可重入性、阻塞性和公平性。

底层原理

  1. synchronized

    synchronized是Java语言内置的关键字,它的实现由JVM直接支持。当一个线程访问synchronized方法或代码块时,JVM会尝试获取锁。如果锁被其他线程持有,则当前线程会被阻塞,直到锁被释放。synchronized的锁释放和获取通常是通过monitor对象来完成的,monitor对象是与每个对象相关联的。

  2. Lock (通过AQS)

    Lock接口是Java的一个并发工具,它通常通过AbstractQueuedSynchronizer(AQS)来实现,如ReentrantLock。AQS是一个基于FIFO队列的同步器,它使用了一个内部状态来表示锁是否被持有,以及等待锁的线程队列。当一个线程尝试获取锁时,它会加入这个队列。如果锁被释放,则队列中的线程会被唤醒并尝试获取锁。

可重入性

  1. synchronized

    synchronized是可重入的,这意味着一个线程可以多次获得同一个锁而不需要再次等待。

  2. Lock (通过AQS)

    ReentrantLock(基于AQS)也是可重入的。一个线程可以多次获取同一个锁,而不会被阻塞。

阻塞性

  1. synchronized

    synchronized是阻塞的。如果线程尝试获取已经被其他线程持有的锁,则当前线程会被阻塞,直到锁被释放。

  2. Lock (通过AQS)

    ReentrantLock(基于AQS)同样是阻塞的。如果锁被其他线程持有,尝试获取锁的线程也会被阻塞,直到锁被释放。但是,Lock接口提供了更灵活的锁获取方式,如tryLock()方法,它允许线程尝试获取锁而不阻塞,如果锁不可用,则立即返回。

公平性

  1. synchronized

    synchronized的公平性取决于JVM的实现和具体的使用场景。在Java 6及之前,synchronized是非公平的,这意味着等待时间最长的线程不一定会首先获取锁。从Java 7开始,synchronized可以通过JVM参数-XX:UseFairSynchronization来设置为公平的。

  2. Lock (通过AQS)

    ReentrantLock默认是非公平的,但可以通过构造函数指定为公平的。公平锁保证等待时间最长的线程会首先获取锁。然而,公平锁通常会导致性能下降,因为每次释放锁时都需要检查队列中的线程,以确定哪个线程应该首先获取锁。

总结来说,synchronized和ReentrantLock(基于AQS)在底层实现、可重入性、阻塞性和公平性方面都有相似的特性。但是,Lock接口提供了更多的灵活性和扩展性,而synchronized是Java语言内置的,使用起来更简单,但可能不如Lock接口那么灵活。

Java synchronized关键字和Lock接口实现原理 主要介绍了Java synchronized关键字和Lock接口实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 立即下载

相关推荐

WSL2 Ubuntu 22.04安装NVIDIA驱动避坑指南:从驱动版本选择到CUDA环境验证

本文详细介绍了在WSL2 Ubuntu 22.04中安装NVIDIA驱动和配置CUDA环境的完整流程,包括驱动版本选择、环境变量设置以及常见问题解决方案。通过本指南,用户可以避免常见的安装陷阱,确保GPU加速环境正确配置,适用于深度学习开发和CUDA编程。

weixin_28419039的博客 463

About AQS——有关AQS与其实现的同步器,自问自答系列

是时候总结一下了

sun_tantan的博客 340

大数据 DataX-Web 详细安装教程

大数据 DataX-Web 详细安装教程

GG Bond 的博客 1万+

synchronized和lock的实现原理和区别【详细】

java中每一个对象都可以作为锁,这是synchronized实现同步的基础: 利用javap工具(javap是java编译之后的class文件的分解器)查看生成的class文件信息来分析Synchronized的实现 从上面可以看出,同步代码块是使用monitorenter和monitorexit指令实现的,同步方法(在这看不出来需要看JVM底层实现)依靠的是方法修饰符上的ACC_SYNCHRONIZED实现。monitorenter指令是在编译后插入到同步代码块的开始位置,monitorexit指令插

weixin_54046648的博客 1750

基于Pixi.js的Live2D看板娘离线加载实战指南

本文详细介绍了基于Pixi.js实现Live2D看板娘离线加载的完整方案,涵盖环境搭建、模型加载、交互功能实现及常见问题解决。通过Pixi.js的硬件加速优势,开发者可在Web和Electron项目中无缝集成离线运行的Live2D模型,提升用户体验并避免网络依赖问题。

weixin_29001423的博客 343

【Halcon】双目立体视觉引导机械手有序抓取,案例分享

本文介绍了一个基于双目视觉的工件定位与抓取系统。该系统使用两个工业相机组成双目视觉系统,通过标定获取相机参数,采用模板匹配算法识别任意摆放且可能交叠的工件。重点阐述了三维坐标获取方法,特别是通过Z方向高度实现有序抓取的策略。文章详细说明了系统搭建、双目标定、模板创建等关键步骤,并展示了特征点匹配和定位结果。该案例为初学者和开发者提供了双目视觉系统的基本实现参考,展示了机器视觉与机械手协同工作的典型应用场景。

机器视觉从业者 2490

synchronized和lock的实现原理

本文转载自http://wenku.baidu.com/view/41480552f01dc281e53af090.html?re=view 目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。 数据同步

tingfeng96的专栏 1万+

使用 MATLAB/Simulink 对一个开关磁阻电机进行建模

*开关磁阻电机(Switched Reluctance Motor, SRM)**是一种新型的无刷电机,以其简单的机械结构、宽广的调速范围和较高的效率在工业应用中得到了广泛关注。SRM的独特之处在于其定子和转子均为凸极结构,并且通过改变绕组电流的方向来实现转矩的产生和控制。本教程将详细介绍如何使用对一个开关磁阻电机进行建模,并探讨其基本控制策略,特别是针对双凸极结构的SRM。本文介绍了如何使用构建一个开关磁阻电机的双凸极结构模型,并探讨了其基本控制策略。

amy_mhd的博客 203

Java 锁机制:Synchronized 原理、锁升级与 Lock 对比

本文从锁策略的分类体系讲起,逐层深入到 synchronized 的底层实现,最后对比 synchronized 和 Lock。

xiaoma的博客 349

Arduino ESP32S3开发环境搭建 ------ 在线下载安装包Failed解决方案

本文介绍了Arduino ESP32 S3开发环境搭建的离线解决方案。

张一西的博客 1018

Python 爬虫实战:爬取哔哩哔哩知识区,抓取高赞课程信息

哔哩哔哩(Bilibili)是一个广受欢迎的综合性视频社区,其中的知识区汇聚了大量优质的教育、科普、技术等课程内容。本文将指导读者如何使用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息,并进行数据分析。本文深入探究了利用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息的全流程。从前期的环境搭建、模拟登录,到核心的课程数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。通过此方法所获取的数据,能够助力创作者优化内容、用户发现优质课程、平台洞察用户需求。

u014481728的博客 1136

Java并发编程实战深入理解Synchronized与Lock锁的底层原理与性能对比

synchronized和Lock是Java并发工具箱中相辅相成的两种利器。synchronized以内置、自动管理的特性提供了便捷性,并通过JVM的持续优化保持了竞争力;Lock则以灵活的API和可定制的行为提供了更强大的控制力。理解其底层基于Monitor和AQS的不同实现原理,是做出正确技术选型、编写高性能并发代码的基础。

agfca的博客 509

Linux----Ubuntu系统官网下载iso镜像文件

Linux----Ubuntu系统官网下载iso镜像文件

MQ0522的博客 5万+

【面试专栏|Java并发编程】Java并发锁对比:synchronized与Lock,底层原理+适用场景详解

摘要: 本文对比Java并发编程中synchronized与Lock接口的核心差异,从底层原理(JVM Monitor vs AQS框架)、锁特性(自动/手动释放、公平性、可中断性等)及使用场景展开分析。synchronized作为关键字简单易用,适合基础同步;Lock接口则提供更灵活的锁控制(如超时尝试、条件唤醒),适用于高并发或复杂场景。通过代码示例和选型指南,帮助开发者在面试和实战中合理选择,避免死锁等问题。

m0_58782205的博客 503

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JDK synchronized wait notify/notifyAll Lock Condition await signal/signalAll

博文目录 文章目录

mrathena 852

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

synchronized 和Lock区别

原文不知道网址,这是转发的转发 https://blog.youkuaiyun.com/hefenglian/article/details/82383569 如有问题,请告诉我 0、synchronized实现原理 Java中每一个对象都可以作为锁,这是synchronized实现同步的基础: 普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法块,锁...

kv110的专栏 2162

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java同步锁工作原理_深入分析 Java Lock 同步锁

前言Java 的锁实现,有 Synchronized 和 Lock。上一篇文章深入分析了 Synchronized 的实现原理:由Java 15废弃偏向锁,谈谈Java Synchronized 的锁机制。本篇文章深入分析 Lock 的实现,以及对比其与 Synchronized 的不同。Synchronized 与 Lock 的对比实现方式:Synchronized 由 JVM 实现;Lock ...

weixin_35947010的博客 251

聊聊Synchronized和Lock

目录 Synchronized和Lock的区别 阻塞线程状态不同 阻塞算法-悲观锁 非阻塞算法-乐观锁 Synchronized和Lock的区别 Synchronized和Lock都可以用来做代码块的同步控制,但是它俩的底层实现不一样,性能也不一样,需要根据不同的应用场景来选择合适的同步器,下面总结一下它俩的区别: 来源不同 Synchronized是Java提供的关键字,属于Java语法层...

程序员小潘 3941

Synchronized和Lock的区别

Synchronized和Lock的区别 并发编程中,锁是经常需要使用的。在开发中我们常用的锁有两种Synchronized和Lock。 线程安全问题 线程安全是在多线程编程中,有可能会出现同时访问同一个 共享、可变资源 的情况,始终都不会导致数据破坏以及其他不该出现的结果。这种资源可以是一个变量、一个对象、一个文件等。 共享:多个线程可以同时访问该共享变量。 可变:数据在生命周期中可以被改变。...

XuJiangDong 1万+

Java Lock和Synchronized区别

一:java.util.concurrent.locks包下常用的类与接口(lock是jdk 1.5后新增的)   (1)Lock和ReadWriteLock是两大锁的根接口,Lock代表实现类是ReentrantLock(可重入锁),ReadWriteLock(读写锁)的代表实现类是ReentrantReadWriteLock。     Lock 接口支持那些语义不同(重入、公平等)的锁规则,可以在非阻塞式结构的上下文(包括 hand-over-hand 和锁重排算法)中使用这些规则。主要的实现是

qq_36342492的博客 2546

锁(synchronized和Lock)

锁(synchronized和lock)1.synchronized① synchronized 基本使用② synchronized 特性synchronized是如何实现的?(面试问题) 使用锁是JAVA中解决线程安全问题的最主要的手段。 JAVA中的锁主要有以下两种: 1.内存锁 synchronized 2.可重入锁 Lock(ReentrantLock) 1.synchronized ① synchronized 基本使用 synchronized 的基本用法有以下 3 种: 1.修饰静态方法

mzpqq的博客 2733

Synchronized和Lock区别

0、synchronized实现原理 Java中每一个对象都可以作为锁,这是synchronized实现同步的基础: 普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法块,锁是括号里面的对象 当一个线程访问同步代码块时,它首先是需要得到锁,当退出或者抛出异常时必须要释放锁,那么它是如何来实现这个机制的呢?我们先看一段简单的代码: package cn.alibab.javap; public class SynchronizedTest { publi

大叶子不小的博客 506

synchronized和Lock的用法对比

在 Java 并发编程中,synchronized关键字和java.util.concurrent.locks.Lock 接口(及其实现类,如ReentrantLock)都是用来实现线程同步、解决共享资源并发访问问题的机制。主要区别在于实现方式、灵活性、功能性和控制粒度上。本文将从下几个方面对synchronized和Lock的用法和原理进行对比介绍.

weixin_57923328的博客 954

synchronized和lock底层原理整理

在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,而ReetrantLock的性能能维持常态。 synchronized 锁不释放,其他线程将一直等待。 JVM层面上实现的,异常自动释放锁 它有多个队列,当多个线程一起访问某个对象监视器的时候,对象监视器会将这些线程存储在不同的容器中。 Contention List:竞争队列,所有请求锁的线程首先被放在这个...

迷失在代码的海洋里 1517

Java中synchronized 和 Lock

Java中synchronized 和 Lock

m0_50742275的博客 1315

多线程学习(五)---java锁机制

参考文章: Java锁机制了解一下 一、synchronized锁 1.1 synchronized锁是什么 synchronized是Java的一个关键字,它能够将代码块(方法)锁起来。 它使用起来是非常简单的,只要在代码块(方法)添加关键字synchronized,即可以实现同步的功能。 public synchronized void deal() { if (...

一个胖子IT男的博客 440
上一篇: java synchronized原理 锁升级原理
下一篇: hashmap线程安全问题 ConcurrentHashMap原理
vmaps
博客等级 码龄17年 424粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值