一.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()锁