多线程数据共享问题(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(); } } } }
-
实验结果
有问题来问哈,写半天没人评论,爱
标签:售票,窗口,SellThread,synchronized,Thread,数据共享,线程,new,多线程 来源: https://blog.csdn.net/qq_43423320/article/details/118916184