多线程数据共享问题(synchronized)
2021/7/19 23:05:50
本文主要是介绍多线程数据共享问题(synchronized),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
多线程数据共享
多线程下共享一个数据可能会出现线程不安全问题,即数据出错问题,原因为一个线程刚刚获取到该数据没有及时处理,该数据就被别的线程获取并使用了,导致该线程获取的数据和该数据实时的状态不一致
**解决方法,加锁
synchronized(Object lock=new Object)**{ run{ ...... } }
加锁后,锁内的程序将在执行完之前不会被夺走cpu,进入阻塞状态。
-
问题描述
目前一趟车设定为
100
张票,由4
个售票窗口进行售票处理,本次挑战需要完成数据共享的效果即可。 -
解题思路
- 需要创建一个子线程类
SellThread
实现Runnable
接口,共享的100
张车票需要在该线程类中进行处理。 - 线程名和票号需要打印输出,输出字符串 “线程名 票号:n” ,n 为票号值。
- 需要在主类
SellTicketsData
的main()
方法中,来启动子线程,也就是售票窗口。 - 线程名分别设置为 “售票窗口1,售票窗口2,售票窗口3,售票窗口4”。
- 类名和输出的信息必须按照以上?要求内容要求进行书写,不能随意扩展,并参考挑战运行效果图的内容,否则会影响挑战正常通过。
- 需要创建一个子线程类
-
我的代码
public class SellTicketsData { public static void main(String[] args) { // 启动 4 个售票窗口 // 程序代码 SellThread st1 = new SellThread(); Thread t1 = new Thread(st1); SellThread st2 = new SellThread(); Thread t2 = new Thread(st2); SellThread st3 = new SellThread(); Thread t3 = new Thread(st3); SellThread st4 = new SellThread(); Thread t4 = new Thread(st4); t1.setName("售票窗口1"); t2.setName("售票窗口2"); t3.setName("售票窗口3"); t4.setName("售票窗口4"); t1.start(); t2.start(); t3.start(); t4.start(); } } // 创建子线程类 SellThread // 程序代码 class SellThread implements Runnable { static int ticket_num = 100; static Object lock = new Object(); @Override public void run() { // TODO Auto-generated method stub while (ticket_num > 0) { synchronized (lock) { if (ticket_num > 0) { System.out.println(Thread.currentThread().getName() + " 票号 :" + ticket_num--); } } try { Thread.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
-
实验结果
-
遇到的问题及解决办法
有问题来问哈,写半天没人评论,爱
这篇关于多线程数据共享问题(synchronized)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15在使用平台私钥进行解密时提示 "私钥解密失败" 错误信息是什么原因?-icode9专业技术文章分享
- 2024-11-15Layui框架有哪些方式引入?-icode9专业技术文章分享
- 2024-11-15Layui框架中有哪些减少对全局环境的污染方法?-icode9专业技术文章分享
- 2024-11-15laydate怎么关闭自动的日期格式校验功能?-icode9专业技术文章分享
- 2024-11-15laydate怎么取消初始日期校验?-icode9专业技术文章分享
- 2024-11-15SendGrid 的邮件发送时,怎么设置回复邮箱?-icode9专业技术文章分享
- 2024-11-15使用 SendGrid API 发送邮件后获取到唯一的请求 ID?-icode9专业技术文章分享
- 2024-11-15mailgun 发送邮件 tags标签最多有多少个?-icode9专业技术文章分享
- 2024-11-15mailgun 发送邮件 怎么批量发送给多个人?-icode9专业技术文章分享
- 2024-11-15如何搭建web开发环境并实现 web项目在浏览器中访问?-icode9专业技术文章分享