_一个简单的卖票例子,主要突出_synchronized的作用。

    1. // 基本的卖票例子
    2. import java.time.OffsetDateTime;
    3. /**
    4. * 真正的多线程开发,公司中的开发,降低耦合性
    5. * 线程就是一个单独的资源类,没有任何附属的操作!
    6. * 1、 属性、方法
    7. */
    8. public class SaleTicketDemo01 {
    9. public static void main(String[] args) {
    10. // 并发:多线程操作同一个资源类, 把资源类丢入线程
    11. Ticket ticket = new Ticket();
    12. // @FunctionalInterface 函数式接口,jdk1.8 lambda表达式 (参数)->{ 代码 }
    13. new Thread(()->{
    14. for (int i = 1; i < 40 ; i++) {
    15. ticket.sale();
    16. }
    17. },"A").start();
    18. new Thread(()->{
    19. for (int i = 1; i < 40 ; i++) {
    20. ticket.sale();
    21. }
    22. },"B").start();
    23. new Thread(()->{
    24. for (int i = 1; i < 40 ; i++) {
    25. ticket.sale();
    26. }
    27. },"C").start();
    28. }
    29. }
    30. // 资源类 OOP
    31. class Ticket {
    32. // 属性、方法
    33. private int number = 30;
    34. // 卖票的方式
    35. // synchronized 本质: 队列,锁
    36. public synchronized void sale(){
    37. if (number>0){
    38. System.out.println(Thread.currentThread().getName()+"卖出了"+(number--)+"票,剩余:"+number);
    39. }
    40. }
    41. }
    1. A卖出了30票,剩余:29
    2. A卖出了29票,剩余:28
    3. A卖出了28票,剩余:27
    4. A卖出了27票,剩余:26
    5. A卖出了26票,剩余:25
    6. B卖出了25票,剩余:24
    7. B卖出了24票,剩余:23
    8. B卖出了23票,剩余:22
    9. B卖出了22票,剩余:21
    10. B卖出了21票,剩余:20
    11. B卖出了20票,剩余:19
    12. B卖出了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