</pre><pre name="code" class="java">/* 通过分析,发现票号能打印出-1,-2的。 多线程的运行出现了问题。 问题原因: 当多条语句操作操作一个线程的共享数据时,一个线程对多条语句只执行一部分,还没有执行完, 另一个线程参与进来,导致共享数据出现问题。 解决办法??: 对多条操作共享数据的语句,让一个执行完,执行过程中,其他线程不能参与。 synchronized(对象) { 要同步代码 } */ class Ticket implements Runnable { private int ticket = 100; Object obj = new Object(); public void run() { /*while(true) { if(ticket > 0) { try { Thread.sleep(10); } catch (InterruptedException ex) { } ///当A、B、C、D都进来,但是没执行输出,然后A执行后,恰好票为0,则就会出现负数,上面的代码是模拟此可能。 System.out.println(Thread.currentThread().getName() + "....sale:" + ticket--); } //增加同步 synchronized(obj) { if(ticket > 0) { ///当A、B、C、D都进来,但是没执行输出,然后A执行后,恰好票为0,则就会出现负数 System.out.println(Thread.currentThread().getName() + "....sale:" + ticket--); } } }*/ //测试二,此时是随机进行卖票,不会出现负数 while(ticket > 0) { System.out.println(Thread.currentThread().getName() + "....sale:" + ticket--); } } } class TicketDemo { public static void main(String[] args) { Ticket tc =new Ticket(); Thread t1 = new Thread(tc); Thread t2 = new Thread(tc); Thread t3 = new Thread(tc); Thread t4 = new Thread(tc); t1.start(); t2.start(); t3.start(); t4.start(); } }