同样是一个买票的例子,不过用的lock锁。

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