Java学习-077-多线程10:线程资源同步问题实例演示
2023-09-11 14:18:59 时间
如果通过 Runnable 接口实现多线程,则多线程实现类中的属性可被多个线程共享。当多个线程同时操作线程同一个共享资源时,有大概率出现资源同步问题,导致最终的结果偏离我们预期的最终结果,甚至完全相反。
下面通过一个简单实例,演示一下多线程的资源同步问题,示例源代码如下所示:
package com.fanfengping.demo; import lombok.extern.slf4j.Slf4j; @Slf4j public class Demo14RunnableSync implements Runnable { private int stockTicket = 50; private int saleTicket = 0; @Override public void run() { while (stockTicket > 0) { log.info("{} 出票一张,售出票数:{},剩余票数:{}", Thread.currentThread().getName(), ++saleTicket, --stockTicket); } } public static void main(String[] args) { Demo14RunnableSync demo14RunnableSync = new Demo14RunnableSync(); for (int i = 1; i < 5; i++) { new Thread(demo14RunnableSync, "窗口" + i).start(); } } }
执行程序,输出的结果如下所示:
[窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:3,剩余票数:47 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:1,剩余票数:49 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:5,剩余票数:45 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:6,剩余票数:44 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:7,剩余票数:43 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:8,剩余票数:42 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:9,剩余票数:41 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:4,剩余票数:46 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:10,剩余票数:40 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:2,剩余票数:48 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:11,剩余票数:39 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:12,剩余票数:38 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:14,剩余票数:36 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:16,剩余票数:34 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:13,剩余票数:37 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:17,剩余票数:33 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:18,剩余票数:32 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:19,剩余票数:31 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:15,剩余票数:35 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:21,剩余票数:29 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:20,剩余票数:30 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:23,剩余票数:27 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:24,剩余票数:26 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:22,剩余票数:28 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:25,剩余票数:25 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:26,剩余票数:24 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:27,剩余票数:23 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:29,剩余票数:21 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:30,剩余票数:20 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:25,剩余票数:25 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:28,剩余票数:22 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:31,剩余票数:19 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:34,剩余票数:16 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:32,剩余票数:18 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:35,剩余票数:15 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:36,剩余票数:14 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:37,剩余票数:13 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:39,剩余票数:11 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:33,剩余票数:17 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:40,剩余票数:10 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:38,剩余票数:12 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:41,剩余票数:9 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:42,剩余票数:8 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:43,剩余票数:7 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:44,剩余票数:6 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:45,剩余票数:5 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:46,剩余票数:4 [窗口2] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口2 出票一张,售出票数:48,剩余票数:2 [窗口1] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口1 出票一张,售出票数:47,剩余票数:3 [窗口3] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口3 出票一张,售出票数:50,剩余票数:0 [窗口4] INFO com.fanfengping.demo.Demo14RunnableSync - 窗口4 出票一张,售出票数:49,剩余票数:1
由此可见,多线程操作无保护同一线程资源时,会导致预期偏离。
那么,如何解决多线程资源同步问题呢? Java 中可通过同步代码块(synchronized)实现,具体示例请参阅后续文章。
相关文章
- 深入java面向对象四:Java 内部类种类及使用解析(转)
- [Java基础] java多线程关于消费者和生产者
- 实例解析java + jQuery + json工作过程(登录)
- java面向对象高级分层实例_数据库操作类
- Java实现 LeetCode 532 数组中的K-diff数对(双指针,滑动窗口)
- Java实现 LeetCode 258 各位相加
- Java实现 LeetCode 130 被围绕的区域
- Java实现 LeetCode 40 组合总和 II(二)
- Java实现 蓝桥杯 算法提高 扶老奶奶过街
- java实现漏掉的账目明细
- Java实现币值最大化问题
- Java实现 蓝桥杯VIP 算法提高 分苹果
- JAVA时钟
- Java通过继承外部类来建立该外部类的protected内部类的实例(转)
- java中的块
- fast-framework – 基于 JDK 8 实现的 Java Web MVC 框架
- java struts2入门学习实例--使用struts2快速实现上传
- 【JAVA】java编译错误:编码UTF8/GBK的不可映射字符
- Java中synchronized的使用实例
- Java核心类库篇2——lang
- 当年的Java考试:JAVA&移动应用&大数据-大三-社区疫苗接种管理系统(全部源码·保姆式呵护)
- 当年的java考试:Java景区预约登记管理系统(maven整合servlet)
- Java中的可变参数使用语法及用途
- Java:JavaFX项目FXML文件应用实例
- JAVA编程:java环境安装和helloworld
- Java如何获取IP属地 ip2region failed to create searcher with x:java.io.FileNotFoundException:( 系统找不到指定的路径)
- 从头认识java-16.5 nio的数据转换
- java中请给一个Abstract类实现接口的实例!
- 【java】Java 抽象类
- 【java】Java并发编程--Java实现多线程的4种方式