日期:2014-05-20  浏览次数:20695 次

用接口Runnable实现多线程问题
本帖最后由 nuaajm 于 2013-07-30 22:09:27 编辑
相同的代码,运行结果每次不一样

public class RunnableDemo {
public static void main(String[] args) {
MyThrd mt = new MyThrd();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
t1.start();
t2.start();
}
}

class MyThrd implements Runnable {
private int ticket = 5;
public void run() {
for (int i = 0; i < 5; i++) {
if (ticket > 0) {
System.out.println("剩余票数:" + ticket--);
}
}
}
}


以下列举了一些运行结果的实录:
引用
剩余票数:5
剩余票数:5
剩余票数:4
剩余票数:3
剩余票数:2
剩余票数:1[/code]

Quote:
剩余票数:5
剩余票数:4
剩余票数:3
剩余票数:2
剩余票数:1


引用
剩余票数:5
剩余票数:4
剩余票数:3
剩余票数:1
剩余票数:2


按照道理,多线程,票数“资源共享”,票数应该依次减少,不过,从结果看,有时候,票数有“逆变”的情况。
请高手释疑,谢谢!
多线程 Runnable

------解决方案--------------------
线程出现的随机性,你线程好像没加锁吧,好久没来了
------解决方案--------------------
你没加锁,
就像两个线程同时运行到ticket--这里时,你觉得会怎么办呢?
第一个线程取到数5,第二个线程也取到数5,然后第一个线程减1返回4,然后第二个线程减1返回4,所以最终还是4.
你加上synchronized锁试试,时间会变长,但是结果会保证正确性
------解决方案--------------------
要么加锁,要么用原子类型等等,因为这个业务觉得了ticket的变量只能被一个线程占有。
------解决方案--------------------
共享资源没加锁啊,PV操作啊,java的话 有一个线程同步的关键字可以实现啊
------解决方案--------------------
因为没有用到 同步呀,既然是多线程,那就是多个线程同时去做自己的事情,
修改run 加个synchronized就好了
public synchronized void run() {
------解决方案--------------------
结果不一样就对了,需要同步
------解决方案--------------------