22. 线程同步的方法:synchronized、lock、reentrantLock

2016/10/1 11:48 上午 posted in  Java comments

sychronized用法两种1)锁方法2)锁对象(sychronized块),可作用于静态方法、类、实例。对效率有较大影响。

Lock是jdk5新增的一个接口,reentrantLock是它的一个实现类。

方法名 说明
lock() 以阻塞的方式获取锁
tryLock() 以非阻塞的方式获取。如取得锁立即返回true,否则false。
tryLock(long timeout, TimeOut unit) 取得锁返回true;否则等待给定的单元时间,等待中获得锁返回true,等待结束,返回fasle。
lockInterruptibly() 获得所立即返回,否则当前线程处于阻塞状态直到获得锁,这个过程中,该线程可以被别的线程中断(InterruptedException)

synchronized和lock的区别
总的来说可以从用法,性能,锁的机制及功能上来区别。

synchronized lock
用法 需要同步的对象中,1)锁方法,2)特定的代码块(锁对象或类),给JVM托管 需要显示地指定起始位置和终止位置。更精准的线程语义
性能 资源竞争不激烈时,优于lock,激烈时,性能下降很快 ReentrantLock性能比较稳定
锁机制 锁的获得与释放都在块结构中,获得多个锁,以相反的顺序释放,自动释放 手动释放做,必须在finally中释放。
功能 无法非阻塞获取锁,进入临界区无法中断,必须阻塞等待释放资源 包含synchronized的功能,提供非阻塞方式获取所、可中断线程的功能