一.Lock锁
从JDK5.0开始,java提供显式定义同步锁来实现同步,使用Lock对象充当,Lock接口是控制多个线程对共享资源进行访问的工具,一般常用其实现类ReentrantLock类
二.Lock锁的使用
需要对代码块进行手动加锁与开锁
class myThread1 implements Runnable{
//多窗口买票
private int ticket = 100;
private ReentrantLock lock = new ReentrantLock();//创建锁
@Override
public void run() {
lock.lock();//加锁
while(ticket>=0){//若有余票则继续
try {
//线程睡眠,但不释放锁,其他线程无法执行
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖票,剩余票数:"+ticket);//卖票
ticket--;
}
lock.unlock();//解锁
}
}
三.synchronized 与 lock锁的不同之处
- synchronized自动加,Lock锁手动加锁(lock()),手动解锁(unlock()),更加灵活
- Lock只有代码块锁,synchronized有代码块锁和方法锁
- 优先使用Lock()锁
本文介绍了Java从JDK5.0开始引入的Lock接口及其典型实现类ReentrantLock,相较于synchronized,Lock提供了更细粒度的锁控制,支持手动加锁和解锁,从而带来更高的灵活性。通过示例展示了如何在多线程环境中使用ReentrantLock进行同步,并对比了synchronized和Lock的区别,强调在适当场景下优先选择Lock锁。
10万+

被折叠的 条评论
为什么被折叠?



