synchronized 是Java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多局限性,比如响应中断等。Lock 提供了比 synchronized更广泛的锁操作,它能以更优雅的方式处理线程同步问题。
Lock和synchronized的区别
-
Lock不是Java语言内置的,Lock是一个类,通过这个类可以实现同步访问;synchronized是Java语言的关键字,因此是内置特性。
-
Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。
Lock提供的方法
- 获取锁的方法
方法 | 描述 |
---|---|
lock() | 用来获取锁,如果锁已被其他线程获取,则进行等待。 |
tryLock() | 表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。 |
tryLock(long time, TimeUnit unit) | 和tryLock()方法是类似的,只不过区别在于这个方法在拿不到锁时会等待一定的时间,在时间期限之内如果还拿不到锁,就返回false。如果如果一开始拿到锁或者在等待期间内拿到了锁,则返回true。 |
lockInterruptibly() | 通过这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。 |
- 释放锁的方法
方法 | 描述 |
---|---|
unlock() | 释放锁 |
ReentrantLock
ReentrantLock,即可重入锁。ReentrantLock是唯一实现了Lock接口的类。
网友评论