118-数据同步的引入与Synchronized的简单介绍

逻辑执行单元-任务

private int index = 1;
private static final int MAX = 500;

@Override
public void run() {
    while (true) {
        if (index > MAX) {
            break;
        }
        Thread.sleep(5);
        System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++));
    }
}

线程调用

// 一个runnable实例被多个线程共享
TicketWindowRunnable ticketWindow = new TicketWindowRunnable();

Thread windowThread1 = new Thread(ticketWindow, "一号窗口");
Thread windowThread2 = new Thread(ticketWindow, "二号窗口");
Thread windowThread3 = new Thread(ticketWindow, "三号窗口");
windowThread1.start();
windowThread2.start();
windowThread3.start();

运行结果:

...
二号窗口 的号码是:501
三号窗口 的号码是:502

分析为什么会出现这种情况?

当index=499的时候,三个线程均不满足index > MAX,同时三个线程均还未执行完成index++,三个线程都不会进入if,所以都可以执行后边的输出语句。

解决方法:使用synchronized同步方法。

synchronized (MONITOR) {
    if (index > MAX) {
        break;
    }
    try {
        Thread.sleep(5);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++));
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com

文章标题:118-数据同步的引入与Synchronized的简单介绍

文章字数:233

本文作者:神秘的小岛岛

发布时间:2019-11-24, 16:35:28

最后更新:2019-11-24, 16:58:32

原始链接:https://www.tuyrk.cn/wang-thread/118-sync-base/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏