问题:
开两个优先级相同的线程处理同一对象的一个属性ticket,第一次运行时Thread-0操作ticket=5,但是却在最后被打印出来,并且线程分配也不是1:1的(尝试过将ticket改为50也会出现48个Thread-1,2个Thread-0的情况),而在第二次运行时很正常,这是为什么?
源码:
class MyThread implements Runnable{
private int ticket = 5;
public void run(){
for( int i = 0; i < 100; i ++ ){
if( ticket > 0 )
System.out.println( Thread.currentThread().getPriority()+ " "+
Thread.currentThread().getName()+ " "+ ticket--);
}
}
}
public class CurrentThreadDemo{
public static void main(String args[]){
MyThread my1 = new MyThread();
//MyThread my2 = new MyThread();
Thread t1 = new Thread(my1);
Thread t2 = new Thread(my1);
t1.start();
t2.start();
}
}
问题截图:
首先,写法有问题,两个线程用同一个资源,必须保证资源是线程安全的,应该用:
其次,你无法保证两个线程的运行速度,可能1个线程做了51次(如果ticket初始值是100的话),另一个线程做了49次;也有极端情况,一个线程做了100次,另一个线程1次也没做到。
一般来说,这么写的话:
线程t1会比线程t2先做(这并不意味着t1做的次数会比t2多),但也非绝对。