|
关于java高级的编程,我们可能都会提到java并发,那么有多少在java并发中需要注意呢?java并发我们一般拿什么技术应对呢?synchronized与Lock比较 区别,下面是本人总结,仅供参考:9 c C w u( B; T( m5 t0 c
* I3 @/ Z" P& h2 c: s1、总体来看,Lock更加的灵活,synchronized能实现的,Lcok都可以实现
. I1 w' ?% L7 J+ o0 P! e( {$ ^) O# ?. x% k* @
2、在多个条件变量或竞争激烈的情况下 ReentrantLock更有优势) a" @7 {% G9 S6 S- t! z
2 x! S' S* ~ }' m* T f- M" I3、ReentrantLock通过代码实现的,必须在finally中释放锁,在其中加入unLock()& I7 M' X' K8 I" A/ m$ k/ Z0 e; [
。synchronized是在jvm层面上实现的,可以用一些监控工具监控锁,在代码执行出现异常的时候,synchronized则是自动释放锁的 p9 K! v9 Z- f; u' o. v! k
/ v4 r# s. @5 b: U3 I
4、ReentrantLock有可轮询的锁请求,如果获取成功,则进行处理,如果不成功,可等待下一次轮询处理,不容易产生死锁。但synchronized则需要一直等待下去,容易产生死锁
. E1 O7 ]+ U( g3 C( M例:+ K% y) B6 ]7 h
A、B线程都要获取对于对象O的锁定,那么A获取到了锁,B需要等A释放后获得% ]- t( ^/ O8 b$ l: e9 l B
如果使用synchronized的话,如果A不释放,那么B会一直等待下去,不能中断$ H& l2 [6 ?# U0 ?% O
如果使用ReentrantLock,B可以在等待一段时间后中断等待,去做别的事情
; k) t* v1 z6 b: A# l* c6 l( I* G9 G& _
5、ReentrantLock获取锁定与三种方式:, z+ X7 D3 ^, J2 e
a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
$ |2 [) }" `# k7 F/ r' m* g7 I5 C' k% _* |! [
b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;9 f+ X' T% h* e: D
; o- y( \2 Z! N" M" M; @
c) tryLock (long timeout, TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;7 ]; V: T" V. }' w7 @- \8 L3 d4 Q
- G# x( l6 S; \$ B
d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到获得锁定,或者当前线程被别的线程中断
' U" n7 S! C9 W8 F- f4 }2 a+ N0 X0 {4 v! I8 j
! ]1 a* y8 l" e7 Y- T* Z L& c4 {5 B6 m* L5 d2 ^
& k% H$ s* ?5 r# F, b: X
! |% x- W' J# X4 q' x" ]7 Z! F
|
|