复习卖票问题
LOCK接口
是什么:
锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象。
Lock接口的实现ReentrantLock可重入锁
class X {
private final ReentrantLock lock = new ReentrantLock();
public void main() {
lock.lock(); // 上锁
try { // 这里写需要加锁的操作
}
finally {
lock.unlock()
}
}
}
代码
package cduck.cn;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 题目 :三个售票员 卖30张票
*
* 高内聚 低耦合的前提下 --》多线程编程的模板+套路:
* 线程 操作(资源对外暴露的方法) 资源
*/
class Ticket {//资源类
int number=30;
Lock lock=new ReentrantLock();
public void saleTickets() {
lock.lock();
try{
if (number>0){
System.out.println(Thread.currentThread().getName()+"\t 卖出第:"+number-- +"张票,还剩余"+number+"张票");
}
}catch (Exception e){
}finally {
lock.unlock();
}
}
}
public class saleTicket {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(()->{for (int i=0;i<30;i++){ticket.saleTickets();}},"张三").start();
new Thread(()->{for (int i=0;i<30;i++){ticket.saleTickets();}},"李四").start();
new Thread(()->{for (int i=0;i<30;i++){ticket.saleTickets();}},"王五").start();
// new Thread(new Runnable() {//匿名内部类(new 接口)
// @Override
// public void run() {
// for (int i=0;i<30;i++){
// ticket.saleTickets();
// }
// }
// },"一号人员").start();
//
// new Thread(new Runnable() {//匿名内部类(new 接口)
// @Override
// public void run() {
// for (int i=0;i<30;i++){
// ticket.saleTickets();
// }
// }
// },"二号人员").start();
//
// new Thread(new Runnable() {//匿名内部类(new 接口)
// @Override
// public void run() {
// for (int i=0;i<30;i++){
// ticket.saleTickets();
// }
// }
// },"三号人员").start();
}
}