1.不同同步手段之间的区别
1.1.Synchronized
在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized 是很合适的。
- 原因在于,编译程序通常会尽可能的进行优化 synchronized,
- synchronized 另外可读性非常好。
1.2.ReentrantLock
ReentrantLock 适用于资源竞争比较激烈的情况。
- 在资源竞争不激烈的情形下,性能稍微比synchronized差点点。
- 当同步非常激烈的时候,synchronized 的性能一下子能下降好几十倍。而 ReentrantLock 还能维持常态。
- 可以实现多样化的同步,比如有时间限制的同步,可以被 Interrupt 的同步等。
1.3.Atomic
Atomic 同样适用于资源竞争比较激烈的情况。
- 不激烈情况下,性能比synchronized 略逊。
- 资源竞争激烈的时候,也能维持常态。Atomic 的性能会优于ReentrantLock一倍左右。
- Atomic 有一个缺点,就是只能同步一个值,一段代码中只能出现一个Atomic 的变量,多于一个同步无效。因为他不能在多个Atomic之间同步。
2.RentranLock 的使用方式
- lock() ,如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
- tryLock() ,如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false。
- tryLock(long timeout,TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false。
- lockInterruptibly() ,如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断。