class SellTickets implements Runnable{
int TicketsNUM = 100;
//事例化一个Object对象,用来做线程的同步
Object obj = new Object();

public void run()
{
//在这里NEW 一个对象和上面NEW 一个对象所运行的结果为什么会不一样?
//这里NEW会出现负数,上面不会。
// Object obj = new Object();      
while(true){
//线程的同步
synchronized(obj){
if(TicketsNUM > 0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "还有票数:" + TicketsNUM);
TicketsNUM--;
}
}
}
}
}
public class TiketsSystem {
public static void main(String[] args) { SellTickets sellT = new SellTickets(); new Thread(sellT).start();
new Thread(sellT).start();
new Thread(sellT).start();
new Thread(sellT).start(); }}
在次谢谢了!

解决方案 »

  1.   

    当然不一样
    在里面new的话没有任何用处呀
      

  2.   

    在上面new的时候,
    SellTickets sellT = new SellTickets();
    创建了一个实例,这个实例有一个成员变量obj。
    new Thread(sellT).start();
    会调用sellT的run方法;程序中一共调用了4次,这4次synchronized(obj)都是用的成员变量obj,也就是同一个obj实例。
    这样同步是正确的,4个线程在同一个对象实例上同步。在run()方法中new的时候:
    SellTickets sellT = new SellTickets();
    创建了一个实例。new Thread(sellT).start();
    会调用sellT的run方法,run方法中会创建一个局部变量obj。
    程序中调用了4次,每次都会创建一个局部变量,也就是说,每个线程拥有的局部变量是不同的实例。他们synchronized(obj)是在不同的实例上同步,没有达到同步的效果。就会出现负数。