|
关于java高级的编程,我们可能都会提到java并发,那么有多少在java并发中需要注意呢?java并发我们一般拿什么技术应对呢?synchronized与Lock比较 区别,下面是本人总结,仅供参考:
( p0 d2 v' ?$ u: r( z2 O. O! z5 U8 B: m0 S: k1 {
1、总体来看,Lock更加的灵活,synchronized能实现的,Lcok都可以实现( _9 w9 k3 g6 K/ G/ _
# @ b/ I- Q e2、在多个条件变量或竞争激烈的情况下 ReentrantLock更有优势
- l) _7 K4 |- ]7 n2 Z7 D( v) N3 C! d. f2 h9 a
3、ReentrantLock通过代码实现的,必须在finally中释放锁,在其中加入unLock()+ K( T! _% z; A
。synchronized是在jvm层面上实现的,可以用一些监控工具监控锁,在代码执行出现异常的时候,synchronized则是自动释放锁的
) J) }( y) t% [7 v, _+ O4 x2 a1 A9 W7 U
4、ReentrantLock有可轮询的锁请求,如果获取成功,则进行处理,如果不成功,可等待下一次轮询处理,不容易产生死锁。但synchronized则需要一直等待下去,容易产生死锁
{# _8 k) w5 R R& s" i例:' G4 {1 o4 f! T i
A、B线程都要获取对于对象O的锁定,那么A获取到了锁,B需要等A释放后获得
, Q: g7 a* p. z5 f9 y" o如果使用synchronized的话,如果A不释放,那么B会一直等待下去,不能中断
7 _7 W b0 c, m- x7 x* H如果使用ReentrantLock,B可以在等待一段时间后中断等待,去做别的事情" Y2 g+ ~7 X) u( M7 k1 _9 v# e
$ x, L' K) }# C b3 M* F Q* r2 z
5、ReentrantLock获取锁定与三种方式:
- l; b% s* U# h, y# z; E8 { a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁/ V' w8 Q) y: I B
& Q3 N9 Y. b$ b& m
b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
S3 E$ Y' n/ W+ G& R- v
9 U4 @: _, G3 C- Q x% Q c) tryLock (long timeout, TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false; z# W; B$ J! L4 J, d
" v. h U' D) r% M. s1 {% h d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到获得锁定,或者当前线程被别的线程中断/ _* Y+ g0 b6 D/ u
8 v% I) M! N: ?0 }: n3 q3 L
- s$ u& ]- A3 w3 P' l1 M& P3 e0 w2 _* F0 D r- H* y
! e3 W4 s- u/ X0 q) b
7 {5 c0 F' l& n- b
|
|