首页 > 其他分享 >synchronized和Lock的区别

synchronized和Lock的区别

时间:2023-07-20 21:34:34浏览次数:31  
标签:释放 同步 synchronized 区别 Lock 死锁 线程

存在层次上

synchronized: Java的关键字,在jvm层面上

Lock: 是一个接口

 

锁的释放

synchronized: 1、以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁

Lock: 在finally中必须释放锁,不然容易造成线程死锁

 

锁的获取

synchronized: 假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待

Lock: 分情况而定,Lock有多个锁获取的方式,大致就是可以尝试获得锁,线程可以不用一直等待(可以通过tryLock判断有没有锁)

 

锁的释放(死锁产生)

synchronized: 在发生异常时候会自动释放占有的锁,因此不会出现死锁

Lock: 发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生

 

锁的状态

synchronized: 无法判断

Lock: 可以判断

 

锁的类型

synchronized: 可重入 不可中断 非公平

Lock: 可重入 可判断 可公平(两者皆可)

 

性能

synchronized: 少量同步

Lock: 大量同步

  • Lock可以提高多个线程进行读操作的效率。(可以通过readwritelock实现读写分离)
  • 在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;
  • ReentrantLock提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在资源竞争不激烈的情形下,性能稍微比synchronized差点点。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。

调度

synchronized: 使用Object对象本身的wait 、notify、notifyAll调度机制

Lock: 可以使用Condition进行线程之间的调度

 

用法

synchronized: 在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。

Lock: 一般使用ReentrantLock类做为锁。在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。

 

底层实现

synchronized: 底层使用指令码方式来控制锁的,映射成字节码指令就是增加来两个指令:monitorenter和monitorexit。当线程执行遇到monitorenter指令时会尝试获取内置锁,如果获取锁则锁计数器+1,如果没有获取锁则阻塞;当遇到monitorexit指令时锁计数器-1,如果计数器为0则释放锁。

Lock: 底层是CAS乐观锁,依赖AbstractQueuedSynchronizer类,把所有的请求线程构成一个CLH队列。而对该队列的操作均通过Lock-Free(CAS)操作。

标签:释放,同步,synchronized,区别,Lock,死锁,线程
From: https://www.cnblogs.com/mark5/p/17569745.html

相关文章

  • No lockfile in this directory. Run `yarn install` to generate one.
    如何解决"Nolockfileinthisdirectory.Runyarninstalltogenerateone."错误介绍在使用Yarn进行JavaScript项目开发时,有时候会遇到一个错误信息:"Nolockfileinthisdirectory.Runyarninstalltogenerateone."这个错误通常是由于项目缺少yarn.lock文件导致......
  • 云原生基础设施实践:NebulaGraph 的 KubeBlocks 集成故事
    像是NebulaGraph这类基础设施上云,通用的方法一般是将线下物理机替换成云端的虚拟资源,依托各大云服务厂商实现“服务上云”。但还有一种选择,就是依托云数据基础设施,将数据库产品变成为云生态的一环,不只是提供自身的数据云服务,还能同其他的数据库一起分析挖掘业务数据价值。在本......
  • Raid0、Raid1、Raid5、Raid6、Raid10、Raid50、Raid60的原理、特点、性能区别
    一.RAID是什么?RAID(RedundantArrayofIndependentDisks)即独立磁盘冗余阵列,简称为「磁盘阵列」,其实就是用多个独立的磁盘组成在一起形成一个大的磁盘系统,从而实现比单块磁盘更好的存储性能和更高的可靠性。二.RAID有哪些?RAID方案常见的可以分为:RAID0RAID1RAID5RAID6......
  • mysql any some 区别
    MySQL中的any和some的区别在MySQL数据库中,我们经常会遇到使用any和some来比较子查询结果的情况。这两个关键词在功能上非常相似,但也有一些微小的区别。本文将介绍any和some的区别,并通过代码示例来说明它们的使用方法和效果。any和some的作用any和some的作用是用来比较子查询结果......
  • TCP和UDP协议的区别
    1、TCP是面向连接的,而UDP是无连接的协议。2、TCP对于传输有用的数据非常可靠,因为它需要确认发送的信息,并且能重新发送丢失的数据包;UDP是一种不可靠的协议,数据包丢失,它不会请求重新传输,目标计算机会收到损坏的数据3、TCP速度较慢,但更健壮,因为TCP在传输数据之前建立连接,并确保数据......
  • mybatis中 #{keyword} , ${keyword} 什么区别
    ${keyword}和#{keyword}是MyBatis中用于参数替换的两种不同的占位符形式,它们有以下区别:${keyword}:这是一种简单的字符串替换占位符形式,它会将占位符${keyword}直接替换为传入的参数值。例如,在XML配置文件中使用${keyword},相当于在SQL语句中直接拼接参数的字符串表......
  • Synchronized关键字同步类方法
    要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下:publicsynchronizedvoidrun(){}   从上面的代码可以看出,只要在void和public之间加上synchronized关键字,就可以使run方法同步,也就是说,对于同一个Java类的对象实例,run方法......
  • django中request.query_params.get()和 request.data.get()的区别
    params用于获取字符串,data:用于获取正文,post方法两个参数都可以使用,get方法只能使用params例如:name=request.query_params.get('name',None)如果URL的查询参数中包含了名为"name"的参数,那么request.query_params.get('name',None)将返回该参数的值。否则,将返回None......
  • 协程与多线程的区别
    多线程和协程处理任务的效率取决于具体的应用场景和实现方式。一般来说,协程比多线程更高效常见比较多线程:优点:多线程可以同时执行多个任务,适用于需要并行执行多个阻塞或计算密集型任务的场景。可以充分利用多核处理器的能力,提高整体的计算性能。......
  • (转)Overlay和Underlay网络协议区别及概述讲解
    原文:https://www.cnblogs.com/fengdejiyixx/p/15567609.html本文分别介绍Overlay网络模型和Underlay网络模型。(一)Overlay网络模型跨主机网络意味着将不同主机上的容器用同一个虚拟网络连接起来。这个虚拟网络的拓扑结构和实现技术就是网络模型。物理网络模型中,连通多个物理网......