Lock锁
Lock接口是控制多个线程对共享资源访问的工具。每次只能有一个线程对lock加锁。常用的实现类是ReentrantLock。
下图代码买票是一个不安全的线程,当我们加入lock锁之后,线程就安全了。一般上锁放到try里面,释放锁放到finally里,能保证出现异常也能释放锁。
public class TestLock {
public static void main(String[] args) {
//定义多个窗口买票
BuyTicket buyTicket1 = new BuyTicket();
BuyTicket buyTicket2 = new BuyTicket();
BuyTicket buyTicket3 = new BuyTicket();
//同时买票
buyTicket1.start();
buyTicket2.start();
buyTicket3.start();
}
}
//买票
class BuyTicket extends Thread {
//使用static,使其变为公共资源
private static int ticket = 10;
//创建一个锁对象
private final ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
//如果票数大于0,买票成功
while (true) {
try {
//上锁
lock.lock();
//模拟买票时间
Thread.sleep(1000);
if (ticket <= 0) {
break;
}
System.out.println(ticket--);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//释放锁
lock.unlock();
}
}
}
}