|
关于java高级的编程,我们可能都会提到java并发,那么有多少在java并发中需要注意呢?java并发我们一般拿什么技术应对呢?synchronized与Lock比较 区别,下面是本人总结,仅供参考:
& n8 t( E/ g* ]+ V, |# p* v. A0 G/ l d1 h6 u/ _; d1 u
1、总体来看,Lock更加的灵活,synchronized能实现的,Lcok都可以实现4 d! s7 I9 C& O" C( u! w. l6 W
# Y; C8 h) m& f3 _$ q6 ?! Z0 y9 L
2、在多个条件变量或竞争激烈的情况下 ReentrantLock更有优势
% q: ]& y) n! o9 I0 n# o* s1 [7 i2 I7 \0 X: U# D
3、ReentrantLock通过代码实现的,必须在finally中释放锁,在其中加入unLock()/ H4 q4 D; o- L- m+ r
。synchronized是在jvm层面上实现的,可以用一些监控工具监控锁,在代码执行出现异常的时候,synchronized则是自动释放锁的
' F6 b5 n9 v! `. d/ W) \/ i+ S# h/ V# G' Z
4、ReentrantLock有可轮询的锁请求,如果获取成功,则进行处理,如果不成功,可等待下一次轮询处理,不容易产生死锁。但synchronized则需要一直等待下去,容易产生死锁
u$ @& `8 Z- [& q+ s$ F例:7 g0 f& e$ B0 E8 g. w( H1 r
A、B线程都要获取对于对象O的锁定,那么A获取到了锁,B需要等A释放后获得
- C% v8 {4 Q) J6 _如果使用synchronized的话,如果A不释放,那么B会一直等待下去,不能中断
2 Y) S+ i/ K0 D [9 @/ x6 {如果使用ReentrantLock,B可以在等待一段时间后中断等待,去做别的事情7 y0 l* ^! }. o
" E+ S- P* v4 x
5、ReentrantLock获取锁定与三种方式:( ^2 K$ I" p- I+ s0 A
a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁0 f; T! N( N: Q0 Z3 e/ p4 K0 E5 ]
' z: E- k' l7 `1 I. E" z* x0 z; ?+ W
b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;5 _/ n- C0 G$ E0 W6 t$ _ r
+ y: v; n% X2 Z# Y1 @1 ?- N8 T; N# j5 l c) tryLock (long timeout, TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;7 \$ F' Q: P7 p
) e1 Q. h) n3 r6 l8 o4 P! s2 A. O
d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到获得锁定,或者当前线程被别的线程中断: p' t4 [" @: `3 \0 d: G5 F
' t. c Q/ O- F, r( a
/ O# O9 ~5 Q+ j1 G% z: l; e+ j( a1 t, B" l" c% Z( s5 y
) J$ E# T& e6 q5 s% S
/ g5 _" U( ~% S: I( z$ l |
|