同样是一个买票的例子,不过用的lock锁。
package com.juc;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class SaleTicketDemo02 {public static void main(String[] args) {// 并发:多线程操作同一个资源类, 把资源类丢入线程Ticket2 ticket = new Ticket2();// @FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }new Thread(()->{for (int i = 1; i < 40 ; i++) ticket.sale();},"A").start();new Thread(()->{for (int i = 1; i < 40 ; i++) ticket.sale();},"B").start();new Thread(()->{for (int i = 1; i < 40 ; i++) ticket.sale();},"C").start();}}// Lock三部曲// 1、 new ReentrantLock();// 2、 lock.lock(); // 加锁// 3、 finally=> lock.unlock(); // 解锁class Ticket2 {// 属性、方法private int number = 30;Lock lock = new ReentrantLock();public void sale(){lock.lock(); // 加锁try {// 业务代码if (number>0){System.out.println(Thread.currentThread().getName()+"卖出了"+(number--)+"票,剩余:"+number);}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock(); // 解锁}}}
A卖出了30票,剩余:29A卖出了29票,剩余:28A卖出了28票,剩余:27A卖出了27票,剩余:26A卖出了26票,剩余:25A卖出了25票,剩余:24C卖出了24票,剩余:23C卖出了23票,剩余:22C卖出了22票,剩余:21C卖出了21票,剩余:20C卖出了20票,剩余:19C卖出了19票,剩余:18B卖出了18票,剩余:17B卖出了17票,剩余:16B卖出了16票,剩余:15B卖出了15票,剩余:14B卖出了14票,剩余:13B卖出了13票,剩余:12B卖出了12票,剩余:11B卖出了11票,剩余:10B卖出了10票,剩余:9B卖出了9票,剩余:8B卖出了8票,剩余:7B卖出了7票,剩余:6B卖出了6票,剩余:5B卖出了5票,剩余:4B卖出了4票,剩余:3B卖出了3票,剩余:2B卖出了2票,剩余:1B卖出了1票,剩余:0
