多线程下共享一个数据可能会出现线程不安全问题,即数据出错问题,原因为一个线程刚刚获取到该数据没有及时处理,该数据就被别的线程获取并使用了,导致该线程获取的数据和该数据实时的状态不一致
**解决方法,加锁
synchronized(Object lock=new Object)**{ run{ ...... } }
加锁后,锁内的程序将在执行完之前不会被夺走cpu,进入阻塞状态。
目前一趟车设定为 100
张票,由 4
个售票窗口进行售票处理,本次挑战需要完成数据共享的效果即可。
SellThread
实现 Runnable
接口,共享的 100
张车票需要在该线程类中进行处理。SellTicketsData
的 main()
方法中,来启动子线程,也就是售票窗口。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(); } } } }
有问题来问哈,写半天没人评论,爱