|
关于java高级的编程,我们可能都会提到java并发,那么有多少在java并发中需要注意呢?java并发我们一般拿什么技术应对呢?synchronized与Lock比较 区别,下面是本人总结,仅供参考:. I0 O- i: b% J. }0 a! t
+ v2 P0 M8 y- M3 Y1 @* ^4 |9 ?
1、总体来看,Lock更加的灵活,synchronized能实现的,Lcok都可以实现
& ~* D& S+ F2 P1 z ]" i$ @' X) S0 N3 X [0 S6 s! C% f3 N
2、在多个条件变量或竞争激烈的情况下 ReentrantLock更有优势
: L# P" `8 F. J. I% p1 u1 z
+ v5 D6 `% W+ N, z3 k0 I5 w, `8 K3、ReentrantLock通过代码实现的,必须在finally中释放锁,在其中加入unLock()
" f; v6 j9 W. S+ E" x) p。synchronized是在jvm层面上实现的,可以用一些监控工具监控锁,在代码执行出现异常的时候,synchronized则是自动释放锁的: W$ d% \% I5 x2 _4 u7 ]
) A; c3 I/ ?) E5 q1 k( a; h4、ReentrantLock有可轮询的锁请求,如果获取成功,则进行处理,如果不成功,可等待下一次轮询处理,不容易产生死锁。但synchronized则需要一直等待下去,容易产生死锁1 C6 Y! |0 P3 \. d9 @, U
例:
4 M# M. s, P3 P- yA、B线程都要获取对于对象O的锁定,那么A获取到了锁,B需要等A释放后获得: Y7 Q& p2 w' c
如果使用synchronized的话,如果A不释放,那么B会一直等待下去,不能中断0 S7 j8 f0 Z0 i* m& o" X: @
如果使用ReentrantLock,B可以在等待一段时间后中断等待,去做别的事情
) ?- U% f8 w! `9 G0 V# }8 V6 \9 j5 z, q; Y" w8 n! O& H5 D5 V
5、ReentrantLock获取锁定与三种方式:
4 q& _( k1 Q: X ~, o a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
' _. v% E9 `1 V, Q7 P/ h% F" L6 @% f W& P+ A, H- L3 T. ?
b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;0 U8 R- L9 ^8 n# a) h0 e
% j; }1 H( R% d9 w
c) tryLock (long timeout, TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;' `5 n; B' c2 q
2 }. L7 K/ ~. f5 s. a2 T
d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到获得锁定,或者当前线程被别的线程中断* w g0 m5 F7 m) W* V9 w2 x n
" m& a& J0 ^6 _1 S3 l3 ?! {' t
: t+ Y1 r: T* l6 Y! Z7 ~2 `! ^; s# Z
) j- F4 t) ]$ S* A0 n5 m
V9 f% H* P: Y( k5 w7 L |
|