持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
Java中常用的锁有哪些
synchronized和lock
他们有什么区别
- synchronized再获得锁后自动释放、代码块中有异常也会释放锁 、 一个线程持有锁其他线程必须等待
- lock:手动释放锁,可以设置锁的超时时间,再超时时间内没有获取锁就进入 catch 中
这篇文章写的很不错,可以借鉴一下
Lock 他是个接口 具体有那些实现类呢!
ReentrantLock
Condition
ReadWriteLock
写一个的简单的应用代码,以ReentrantLock为例、随后再做源码分析
基本语法:且必须这么写 不然会造成线程阻塞
private void LockReentrantLock() {
lock.lock();
try {
} finally {
lock.unlock();
}
}
测试Dome
public class LockTest {
private ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
LockTest lockTest = new LockTest();
new Thread(()->{
lockTest.lockReentrantLock();
}).start();
}
private void lockReentrantLock() {
lock.lock();
try {
System.out.println("我获取这这把锁---哈哈 开心"+Thread.currentThread().getName());
} finally {
lock.unlock();
}
}
}
结果打印

Lock接口中有那些必要方法
public interface Lock {
void lock();
除非当前线程被中断,否则获取锁。
如果可用,则获取锁并立即返回。
如果锁不可用,则当前线程将被禁用以用于线程调度目的并处于休眠状态,直到发生以下两种情况之一:
锁被当前线程获取;或者
其他一些线程中断当前线程,支持获取锁的中断。
如果当前线程:
在进入此方法时设置其中断状态;或者
获取锁时中断,支持获取锁中断,
void lockInterruptibly() throws InterruptedException;
仅当调用时它是空闲的时才获取锁。
如果锁可用,则获取锁并立即返回值为true 。如果锁不可用,则此方法将立即返回值false 。
boolean tryLock();
如果在给定的等待时间内空闲并且当前线程没有被中断,则获取锁。
如果锁可用,则此方法立即返回值true 。如果锁不可用,则当前线程将被禁用以用于线程调度目的并处于休眠状态,直到发生以下三种情况之一
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
释放锁
void unlock();
Condition newCondition();
}
