|
关于java高级的编程,我们可能都会提到java并发,那么有多少在java并发中需要注意呢?java并发我们一般拿什么技术应对呢?synchronized与Lock比较 区别,下面是本人总结,仅供参考:- E' {! h* q5 f
) o: x1 v8 W- J1、总体来看,Lock更加的灵活,synchronized能实现的,Lcok都可以实现) x' K1 j( A0 {4 ~3 i6 g/ m# U
* S0 f( \+ M+ m* L
2、在多个条件变量或竞争激烈的情况下 ReentrantLock更有优势
; l4 w+ G0 Z# q' M O* x0 F
! w' l6 o& P' J: c$ b8 P5 w" h3、ReentrantLock通过代码实现的,必须在finally中释放锁,在其中加入unLock()2 X6 U3 P! H$ g; R) g
。synchronized是在jvm层面上实现的,可以用一些监控工具监控锁,在代码执行出现异常的时候,synchronized则是自动释放锁的/ d- Y& _2 @2 Q! G2 y( [6 [5 O
4 H! d2 Z1 e' \2 b
4、ReentrantLock有可轮询的锁请求,如果获取成功,则进行处理,如果不成功,可等待下一次轮询处理,不容易产生死锁。但synchronized则需要一直等待下去,容易产生死锁. |& c- R. M$ Z+ y: g
例:1 `0 W6 C( r# z0 \
A、B线程都要获取对于对象O的锁定,那么A获取到了锁,B需要等A释放后获得
( q6 t9 P2 w! x$ c5 Q9 H如果使用synchronized的话,如果A不释放,那么B会一直等待下去,不能中断* n1 Y/ s/ m; T) L0 B# v6 F8 t2 F
如果使用ReentrantLock,B可以在等待一段时间后中断等待,去做别的事情
% q0 [( e7 S6 `7 D! L/ w: N1 {, P$ ~+ S, `) x9 P# f M2 a
5、ReentrantLock获取锁定与三种方式:1 Y5 Z/ k6 G: s8 A4 w
a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁0 s" s7 j) Q5 U' T
/ d7 v" u7 U0 g: M' ~
b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
Z" I# A( H: L% W7 C, W+ K. G. X$ P
c) tryLock (long timeout, TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;7 p/ `# W! _7 w+ b) y
$ K$ W- K: N, R6 _6 I) I) k9 P+ r
d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到获得锁定,或者当前线程被别的线程中断
t! q: ]& C( s' m* q, \7 i" J: e( ^ n7 Z7 {$ p7 X
! R( q2 z7 H0 h( ]) U0 |$ a" e
5 j+ m% A& ]; @7 H: [, R
! O5 y( X- V: z) g$ V: O( }$ i' w' d5 i4 ?
|
|