详谈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