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的功能,提供非阻塞方式获取所、可中断线程的功能 |