|
关于java高级的编程,我们可能都会提到java并发,那么有多少在java并发中需要注意呢?java并发我们一般拿什么技术应对呢?synchronized与Lock比较 区别,下面是本人总结,仅供参考:
! l2 z! \3 L: m) F( a$ k$ G3 X4 U+ ]
1、总体来看,Lock更加的灵活,synchronized能实现的,Lcok都可以实现
* s5 J1 V, ?' n: s4 ?
2 Z4 B! n2 g: c/ n, U% D# k3 g2、在多个条件变量或竞争激烈的情况下 ReentrantLock更有优势
' c6 `9 p+ R! \' X* Y; F1 x) |
' K' J! Z1 V1 Y8 e3、ReentrantLock通过代码实现的,必须在finally中释放锁,在其中加入unLock()3 I: n2 @0 R7 B% \) Y
。synchronized是在jvm层面上实现的,可以用一些监控工具监控锁,在代码执行出现异常的时候,synchronized则是自动释放锁的6 ^" l7 `; E) {* G
/ W" p9 c8 Z8 O( q7 |2 X/ |! |
4、ReentrantLock有可轮询的锁请求,如果获取成功,则进行处理,如果不成功,可等待下一次轮询处理,不容易产生死锁。但synchronized则需要一直等待下去,容易产生死锁
9 q( \% g, i4 _例:
( }5 z t: t3 b7 ]A、B线程都要获取对于对象O的锁定,那么A获取到了锁,B需要等A释放后获得; U' I" a$ V; o$ h' w9 Z
如果使用synchronized的话,如果A不释放,那么B会一直等待下去,不能中断
/ L" W M4 V- \4 X如果使用ReentrantLock,B可以在等待一段时间后中断等待,去做别的事情" O0 a$ S4 J) C9 l$ z2 ~2 {& E
: h8 m& Q( O$ f1 z. N8 i% P* H6 p
5、ReentrantLock获取锁定与三种方式:' D$ O) F$ x3 a! }9 ^8 t
a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
7 O8 `; Y4 `* ^. I, e% C8 k9 R% G& e
b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;, ~; p4 Z! N! ~1 R/ R8 t: m
8 X2 F( h2 x0 n8 w
c) tryLock (long timeout, TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;* }! ~1 V0 Q% q- V: D5 B: r% {% \8 z
" l6 \- J u( J0 l# t! h
d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到获得锁定,或者当前线程被别的线程中断% A: Z9 i2 |$ ?' }% j6 R# |8 Q
) a2 j8 ]8 ~, ?) p- D! v
2 Y0 Y2 N3 m _: n1 A) M8 X' W; M
9 D- v/ R2 w3 D% Q" Y J- Z/ u* \" g" x% \8 C
, v U: m9 j3 B9 ^ |
|