|
关于java高级的编程,我们可能都会提到java并发,那么有多少在java并发中需要注意呢?java并发我们一般拿什么技术应对呢?synchronized与Lock比较 区别,下面是本人总结,仅供参考:! R% E( L o* L/ Q6 y$ e* j
4 T- V; ?7 F: j( `8 _
1、总体来看,Lock更加的灵活,synchronized能实现的,Lcok都可以实现
; f& s8 }1 L- L9 y, v
7 x! a# w( X d4 m2、在多个条件变量或竞争激烈的情况下 ReentrantLock更有优势
) J' K6 J* f- o* v0 j4 i, \1 S3 j! C# ?- _) j9 @+ q
3、ReentrantLock通过代码实现的,必须在finally中释放锁,在其中加入unLock()
7 r/ k) ]: G* U。synchronized是在jvm层面上实现的,可以用一些监控工具监控锁,在代码执行出现异常的时候,synchronized则是自动释放锁的
, ^% `# k0 M# X5 o8 l1 s+ m9 c. Q: o' h/ p9 E
4、ReentrantLock有可轮询的锁请求,如果获取成功,则进行处理,如果不成功,可等待下一次轮询处理,不容易产生死锁。但synchronized则需要一直等待下去,容易产生死锁
2 M1 A+ X3 } a例:. _* s: G/ r+ N( ~6 x
A、B线程都要获取对于对象O的锁定,那么A获取到了锁,B需要等A释放后获得8 @2 {5 \! l" l
如果使用synchronized的话,如果A不释放,那么B会一直等待下去,不能中断1 A( r7 m7 n/ V+ h) M2 I) R
如果使用ReentrantLock,B可以在等待一段时间后中断等待,去做别的事情
( M0 g9 o r# Y3 S3 k* d
& z6 ]2 Q% U8 i/ X" H+ w# g5、ReentrantLock获取锁定与三种方式:* d1 n8 d' V5 ]; X
a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
+ O; z5 B" T6 Y3 e, B2 [' N
( L- s# h D( d0 P; l& P b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
0 i" X+ I% J. y! n/ ^
, c: ^1 V& M m c) tryLock (long timeout, TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
' Q1 ?# @2 z! Y- X$ ]/ p# v4 @9 K4 ]+ P+ s. K/ M3 i
d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到获得锁定,或者当前线程被别的线程中断
% ~7 t/ J. s- `* I4 t6 Z( \3 s8 W; E ?; y5 R
% p" p$ X* E7 ?8 y$ G( a
/ i& h* u* S9 ?5 i
) v# a8 B; J$ o5 B i( T$ I' H
; S( C' X9 _/ T5 f* D4 s
|
|