详谈Lock与synchronized 的区别

作者:jingxian 时间:2023-03-26 18:13:14 

1、lock是可中断锁,而synchronized 不是可中断锁

线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定,

如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断

如果 使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情

ReentrantLock获取锁定与三种方式:

a)  lock(),如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁

b) tryLock(),如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;

c) tryLock(long timeout,TimeUnit unit),如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;

d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断

2、synchronized是在JVM层面上实现的,lock是通过代码实现的,JVM会自动释放锁定(代码执行完成或者出现异常),但是使用Lock则不行,要保证锁定一定会被释放,就必须将unLock()放到finally{}中。

3、在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;

标签:synchronized,lock
0
投稿

猜你喜欢

  • Java使用GZIP压缩导致HTTP请求返回乱码问题解决

    2022-04-12 07:31:09
  • struts2 validation.xml 验证规则代码解析

    2021-09-14 22:01:27
  • Android编程开发之ScrollView嵌套GridView的方法

    2023-02-16 08:21:00
  • Spring Security 实现短信验证码登录功能

    2022-11-02 19:39:30
  • Android 使用gradle打包Assets目录的案例

    2023-08-05 22:29:45
  • 结合Windows窗口深入分析Android窗口的实现

    2022-04-03 16:50:20
  • Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    2021-12-31 21:49:14
  • Java校验银行卡是否正确的核心代码

    2022-01-28 19:53:29
  • C#绘制飞行棋地图小程序

    2021-11-20 23:19:10
  • Android实现EditText中添加和删除bitmap的方法

    2022-04-02 00:51:14
  • Android XListView下拉刷新和上拉加载更多

    2022-11-01 19:07:45
  • Java线程中的常见方法(start方法和run方法)

    2023-11-16 17:41:32
  • Java中关于二叉树的概念以及搜索二叉树详解

    2023-01-12 00:09:25
  • C#多线程之Thread中Thread.Join()函数用法分析

    2022-01-20 14:47:58
  • Android开发之自定义加载动画详解

    2023-07-27 01:41:05
  • C#之CLR内存深入分析

    2023-01-24 17:18:07
  • C#中结构体定义并转换字节数组详解

    2023-01-23 11:07:50
  • C#实现控制台飞行棋小游戏

    2023-01-01 15:43:12
  • Java客户端利用Jedis操作redis缓存示例代码

    2021-05-31 03:43:42
  • SpringBoot如何实现word文档转pdf

    2023-04-19 09:33:55
  • asp之家 软件编程 m.aspxhome.com