t1.start(); t2.start();t3.start();都会调用他们各自的run方法。
t1,t2,t3运行的目标对象都是Ticket类型的t实例,
当实例t创建时,放在run方法外面的Object o就只初始化一次,所以t1,t2,t3就使用同一个锁对象。所以这3个线程是同步的。
而如果将锁(Object o)放在run方法内部进行初始化,当Ticket t进行初始化时,不会调用Ticker类内部的run方法,也没有锁的实例,当t1.start();运行时,就会调用run方法对Object o这个局部变量进行初始化,会产生一块内存来存储属于t1线程的o对象,但当t2.start();运行时,也会调用run方法对Object o这个局部变量进行初始化,会产生另一块内存来存储属于t2线程的o对象,t3也会产生另一块内存来存储属于t3线程的o对象。三个线程使用三个不同的锁,那他们弎也就就不同步了。 |