class ThreadTest extends Thread{ static int ticketNum = 50; //一定要设置为静态变量,这样多个对象实例共享的是一份数据,操作的也是同一份数据 public ThreadTest(String name) { // TODO Auto-generated constructor stub super(name); } @Override public void run() { // TODO Auto-generated method stub super.run(); while(true){ if(ticketNum>0){ System.out.println(this.getName()+"售出了第"+(50-ticketNum+1)+"张票"); ticketNum --; }else{ System.out.println("卖完了....."); break; } } } }
//main方法 public static void main(String[] args) { ThreadTest t1 = new ThreadTest("窗口1"); ThreadTest t2 = new ThreadTest("窗口2"); ThreadTest t3 = new ThreadTest("窗口3"); t1.start(); t2.start(); t3.start(); }
我们看看结果窗口2售出了第1张票窗口1售出了第1张票窗口1售出了第3张票窗口3售出了第1张票窗口1售出了第4张票窗口2售出了第2张票窗口1售出了第6张票窗口3售出了第5张票窗口1售出了第8张票窗口2售出了第7张票窗口1售出了第10张票窗口3售出了第9张票窗口1售出了第12张票窗口2售出了第11张票窗口1售出了第14张票窗口3售出了第13张票窗口1售出了第16张票窗口2售出了第15张票窗口1售出了第18张票窗口3售出了第17张票窗口1售出了第20张票窗口2售出了第19张票窗口1售出了第22张票窗口3售出了第21张票窗口1售出了第24张票窗口2售出了第23张票窗口1售出了第26张票窗口3售出了第25张票窗口1售出了第28张票窗口2售出了第27张票窗口1售出了第30张票窗口3售出了第29张票窗口1售出了第32张票窗口2售出了第31张票窗口1售出了第34张票窗口3售了第33张票窗口1售出了第36张票窗口2售出了第35张票窗口1售出了第38张票窗口3售出了第37张票窗口1售出了第40张票窗口2售出了第39张票窗口1售出了第42张票窗口3售出了第41张票窗口1售出了第44张票窗口2售出了第43张票窗口1售出了第46张票窗口3售出了第45张票窗口1售出了第48张票窗口2售出了第47张票窗口1售出了第50张票卖完了.....窗口3售出了第49张票卖完了.....卖完了.... //结果中我们可以看到有的同一张票被卖出了两次,这就是不同的线程在访问共享数据时容易出现的问题,由于上一线程的操作未结束,下一线程又进行操作,就造成数据更新不及时,也就出现了线程的安全问题。