多线程安全问题及synchronized使用方式

多线程模拟两个窗口售票,解决线程安全问题和超卖问题 ,代码如下,供初学者参考学习

public class ThreadDemo implements Runnable {
    // 多线程模拟售票问题: 会有线程安全问题及超卖问题
    private int count = 100;

    @Override
    public void run() {
        while (count > 0) {
            saleTickets();
        }
    }

    private synchronized void saleTickets() {
        if (count > 0) {
            System.out.println(Thread.currentThread() + ":窗口售出的第:" + (100 - count + 1) + "张票");
            count--;
            System.out.println("剩余票数:" + count);
        }
    }

    public static void main(String[] args) {
        ThreadDemo threadDemo1 = new ThreadDemo();
        Thread thread1 = new Thread(threadDemo1, "窗口1");
        Thread thread2 = new Thread(threadDemo1, "窗口2");
        thread1.start();
        thread2.start();

    }
}

运行结果如下:

Thread[窗口1,5,main]:窗口售出的第:1张票
剩余票数:99
Thread[窗口2,5,main]:窗口售出的第:2张票
剩余票数:98
Thread[窗口2,5,main]:窗口售出的第:3张票
剩余票数:97
Thread[窗口2,5,main]:窗口售出的第:4张票
剩余票数:96
Thread[窗口2,5,main]:窗口售出的第:5张票
剩余票数:95
Thread[窗口2,5,main]:窗口售出的第:6张票
剩余票数:94
Thread[窗口2,5,main]:窗口售出的第:7张票
剩余票数:93
Thread[窗口2,5,main]:窗口售出的第:8张票
剩余票数:92
Thread[窗口2,5,main]:窗口售出的第:9张票
剩余票数:91
Thread[窗口2,5,main]:窗口售出的第:10张票
剩余票数:90
Thread[窗口2,5,main]:窗口售出的第:11张票
剩余票数:89
Thread[窗口2,5,main]:窗口售出的第:12张票
剩余票数:88
Thread[窗口2,5,main]:窗口售出的第:13张票
剩余票数:87
Thread[窗口2,5,main]:窗口售出的第:14张票
剩余票数:86
Thread[窗口2,5,main]:窗口售出的第:15张票
剩余票数:85
Thread[窗口2,5,main]:窗口售出的第:16张票
剩余票数:84
Thread[窗口2,5,main]:窗口售出的第:17张票
剩余票数:83
Thread[窗口2,5,main]:窗口售出的第:18张票
剩余票数:82
Thread[窗口2,5,main]:窗口售出的第:19张票
剩余票数:81
Thread[窗口2,5,main]:窗口售出的第:20张票
剩余票数:80
Thread[窗口2,5,main]:窗口售出的第:21张票
剩余票数:79
Thread[窗口2,5,main]:窗口售出的第:22张票
剩余票数:78
Thread[窗口2,5,main]:窗口售出的第:23张票
剩余票数:77
Thread[窗口2,5,main]:窗口售出的第:24张票
剩余票数:76
Thread[窗口2,5,main]:窗口售出的第:25张票
剩余票数:75
Thread[窗口2,5,main]:窗口售出的第:26张票
剩余票数:74
Thread[窗口2,5,main]:窗口售出的第:27张票
剩余票数:73
Thread[窗口2,5,main]:窗口售出的第:28张票
剩余票数:72
Thread[窗口2,5,main]:窗口售出的第:29张票
剩余票数:71
Thread[窗口2,5,main]:窗口售出的第:30张票
剩余票数:70
Thread[窗口2,5,main]:窗口售出的第:31张票
剩余票数:69
Thread[窗口2,5,main]:窗口售出的第:32张票
剩余票数:68
Thread[窗口2,5,main]:窗口售出的第:33张票
剩余票数:67
Thread[窗口2,5,main]:窗口售出的第:34张票
剩余票数:66
Thread[窗口2,5,main]:窗口售出的第:35张票
剩余票数:65
Thread[窗口2,5,main]:窗口售出的第:36张票
剩余票数:64
Thread[窗口2,5,main]:窗口售出的第:37张票
剩余票数:63
Thread[窗口2,5,main]:窗口售出的第:38张票
剩余票数:62
Thread[窗口2,5,main]:窗口售出的第:39张票
剩余票数:61
Thread[窗口2,5,main]:窗口售出的第:40张票
剩余票数:60
Thread[窗口2,5,main]:窗口售出的第:41张票
剩余票数:59
Thread[窗口2,5,main]:窗口售出的第:42张票
剩余票数:58
Thread[窗口2,5,main]:窗口售出的第:43张票
剩余票数:57
Thread[窗口2,5,main]:窗口售出的第:44张票
剩余票数:56
Thread[窗口2,5,main]:窗口售出的第:45张票
剩余票数:55
Thread[窗口2,5,main]:窗口售出的第:46张票
剩余票数:54
Thread[窗口2,5,main]:窗口售出的第:47张票
剩余票数:53
Thread[窗口2,5,main]:窗口售出的第:48张票
剩余票数:52
Thread[窗口2,5,main]:窗口售出的第:49张票
剩余票数:51
Thread[窗口2,5,main]:窗口售出的第:50张票
剩余票数:50
Thread[窗口2,5,main]:窗口售出的第:51张票
剩余票数:49
Thread[窗口2,5,main]:窗口售出的第:52张票
剩余票数:48
Thread[窗口2,5,main]:窗口售出的第:53张票
剩余票数:47
Thread[窗口2,5,main]:窗口售出的第:54张票
剩余票数:46
Thread[窗口2,5,main]:窗口售出的第:55张票
剩余票数:45
Thread[窗口2,5,main]:窗口售出的第:56张票
剩余票数:44
Thread[窗口2,5,main]:窗口售出的第:57张票
剩余票数:43
Thread[窗口2,5,main]:窗口售出的第:58张票
剩余票数:42
Thread[窗口2,5,main]:窗口售出的第:59张票
剩余票数:41
Thread[窗口2,5,main]:窗口售出的第:60张票
剩余票数:40
Thread[窗口2,5,main]:窗口售出的第:61张票
剩余票数:39
Thread[窗口2,5,main]:窗口售出的第:62张票
剩余票数:38
Thread[窗口2,5,main]:窗口售出的第:63张票
剩余票数:37
Thread[窗口2,5,main]:窗口售出的第:64张票
剩余票数:36
Thread[窗口2,5,main]:窗口售出的第:65张票
剩余票数:35
Thread[窗口2,5,main]:窗口售出的第:66张票
剩余票数:34
Thread[窗口2,5,main]:窗口售出的第:67张票
剩余票数:33
Thread[窗口2,5,main]:窗口售出的第:68张票
剩余票数:32
Thread[窗口2,5,main]:窗口售出的第:69张票
剩余票数:31
Thread[窗口2,5,main]:窗口售出的第:70张票
剩余票数:30
Thread[窗口2,5,main]:窗口售出的第:71张票
剩余票数:29
Thread[窗口2,5,main]:窗口售出的第:72张票
剩余票数:28
Thread[窗口2,5,main]:窗口售出的第:73张票
剩余票数:27
Thread[窗口2,5,main]:窗口售出的第:74张票
剩余票数:26
Thread[窗口2,5,main]:窗口售出的第:75张票
剩余票数:25
Thread[窗口2,5,main]:窗口售出的第:76张票
剩余票数:24
Thread[窗口2,5,main]:窗口售出的第:77张票
剩余票数:23
Thread[窗口2,5,main]:窗口售出的第:78张票
剩余票数:22
Thread[窗口2,5,main]:窗口售出的第:79张票
剩余票数:21
Thread[窗口2,5,main]:窗口售出的第:80张票
剩余票数:20
Thread[窗口2,5,main]:窗口售出的第:81张票
剩余票数:19
Thread[窗口2,5,main]:窗口售出的第:82张票
剩余票数:18
Thread[窗口2,5,main]:窗口售出的第:83张票
剩余票数:17
Thread[窗口2,5,main]:窗口售出的第:84张票
剩余票数:16
Thread[窗口2,5,main]:窗口售出的第:85张票
剩余票数:15
Thread[窗口2,5,main]:窗口售出的第:86张票
剩余票数:14
Thread[窗口2,5,main]:窗口售出的第:87张票
剩余票数:13
Thread[窗口2,5,main]:窗口售出的第:88张票
剩余票数:12
Thread[窗口2,5,main]:窗口售出的第:89张票
剩余票数:11
Thread[窗口2,5,main]:窗口售出的第:90张票
剩余票数:10
Thread[窗口2,5,main]:窗口售出的第:91张票
剩余票数:9
Thread[窗口2,5,main]:窗口售出的第:92张票
剩余票数:8
Thread[窗口2,5,main]:窗口售出的第:93张票
剩余票数:7
Thread[窗口2,5,main]:窗口售出的第:94张票
剩余票数:6
Thread[窗口2,5,main]:窗口售出的第:95张票
剩余票数:5
Thread[窗口2,5,main]:窗口售出的第:96张票
剩余票数:4
Thread[窗口2,5,main]:窗口售出的第:97张票
剩余票数:3
Thread[窗口2,5,main]:窗口售出的第:98张票
剩余票数:2
Thread[窗口2,5,main]:窗口售出的第:99张票
剩余票数:1
Thread[窗口2,5,main]:窗口售出的第:100张票
剩余票数:0

Process finished with exit code 0

synchronized 的使用方式:

1.代码块形式:任意对象都可以作为锁来使用,一般 使用this

2.用在方法上进行修饰:默认使用this作为锁,如果方法同时被static关键字修饰,使用.class字节码文件作为锁的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值