Lock是显示锁,需要手动的开启和关闭,与之对应的另一种锁是synchronized锁,是隐式锁,出了作用域之后能够自动释放。
Lock锁的使用:还是以车站多窗口卖票为例
class Window implements Runnable{
private int ticket=100;
// 1.实例化lock
private ReentrantLock lock=new ReentrantLock(true);
@Override
public void run() {
while (true){
try {
// 2.调用lock方法
lock.lock();
if (ticket>0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"售票,票号为"+ticket);
}else{
break;
}
}finally {
// 3. 调用解锁的方法
lock.unlock();
}
}
}
}
public class LockTest {
public static void main(String[] args) {
Window window=new Window();
Thread thread=new Thread(window);
Thread thread1=new Thread(window);
Thread thread2=new Thread(window);
// 调用启动多线程,实现多窗口卖票
thread.start();
thread1.start();
thread2.start();
}
}
关于synchronized锁,请参考上一篇线程同步问题
Lock锁、synchronized锁二者异同:
相同: 无论是Lock锁还是synchronized锁,二者都可以解决线程安全的问题。
不同:
synchronized机制在执行完相应的同步代码后,自动释放同步监视器,而Lock锁需要手动的启动和结束锁。