同步解决票数多发的问题

同步:

提示:这里简述项目相关背景:
例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)


问题描述:

提示:售票窗口进行买票的时候,票数不能够进行同步。造成超发现象。

    
    @Test
    public void test_ThreadSynchronized() {
        MyThread mt = new MyThread() ;  // 定义线程对象
        Thread t1 = new Thread(mt) ;    // 定义Thread对象
        Thread t2 = new Thread(mt) ;    // 定义Thread对象
        Thread t3 = new Thread(mt) ;    // 定义Thread对象
        t1.start() ;    // 启动线程
        t2.start() ;    // 启动线程
        t3.start() ;    // 启动线程
    }

// 3.1、线程的强制执行
class ThreadSynchronized implements Runnable {
    private int count = 10;
    // 覆写run()方法,作为线程 的操作主体
    public void run() {
        while (count > 0) {
                //            线程的休眠,在 test_ThreadSleep 演示的时候使用
                try {
                    Thread.sleep(500); // 线程休眠
                } catch (InterruptedException e) {
//                System.out.println("3、休眠被终止");
                    return; // 返回调用处。 没有返回会多输出一个,为什么?
                }
                System.out.println(Thread.currentThread().getName() + "票数" + "count=" + this.count--);
        }
    }
}
//执行结果
/*
Thread-2运行count=9
Thread-1运行count=10
Thread-2运行count=7
Thread-1运行count=6
Thread-2运行count=5
Thread-3运行count=8
Thread-2运行count=3
Thread-1运行count=4
Thread-2运行count=1
Thread-3运行count=2
* */

原因分析:

没有进行数据的同步


解决方案:

加入同步。

class ThreadSynchronized implements Runnable {
    private int count = 10;

    // 覆写run()方法,作为线程 的操作主体
    public void run() {
        while (count > 0) {
            synchronized (this) {
                //            线程的休眠,在 test_ThreadSleep 演示的时候使用
                try {
                    Thread.sleep(500); // 线程休眠
                } catch (InterruptedException e) {
//                System.out.println("3、休眠被终止");
                    return; // 返回调用处。 没有返回会多输出一个,为什么?
                }
                System.out.println(Thread.currentThread().getName() + "票数" + "count=" + this.count--);
            }
        }
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值