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" 转载请保留原文链接及作者。