继承Thread的时候,Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket() 就产生了四个对象(400张票)了
而实现Runnable接口的时候Ticket t = new Ticket()只有100张票
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t)然后分给4个人用,所以就只会买100张票
1.对于继承时加static修饰tick变量,四个线程就能共享100张票的原因
static 关键字的作用:被static修饰的成员变量和成员方法独立于该类(可以理解为Ticket类)的任何对象(可以理解为Ticket t=new Ticket();中的t对象)。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象(百科)。
我的理解是,当tick前加了static关键字时,tick变量将在Ticket类被加载的时候被创建,以后在每次new Ticket()时,Ticket类的对象的tick变量将都指向Ticket类加载时创建的tick的内存区域,也就说
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();t1,t2,t3,t4指向是同一个tick变量,即四个线程都是操作同一个tick变量,所以所以四个线程就能共享100张票对于tick变量未加static时t1,t2,t3,t4每个对象将都有一个自己的tick变量,每个线程将各买各的票,所以会出现 打印显示 同一个票被买四次的情况
2.对于实现Runnable时,线程就能共享100张票的原因Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();