用接口Runnable实现多线程有关问题
用接口Runnable实现多线程问题本帖最后由 nuaajm 于 2013-07-30 22:09:27 编辑相同的代码,运行结果每次不
用接口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() {[解决办法] 结果不一样就对了,需要同步------解决方案--------------------
对ticket加synchronized 同步[解决办法] 需要同步,所有线程,都共享System.out资源,对System.out同步即可package org.lyx.test; 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 static int ticket = 5; public void run() { for (int i = 0; i < 5; i++) { synchronized (System.out) { if (ticket > 0) System.out.println("剩余票数:" + ticket--); } } } } [解决办法] #8也行,是对方法块同步package org.lyx.test; 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 static int ticket = 5; public synchronized void run() { for (int i = 0; i < 5; i++) { if (ticket > 0) System.out.println("剩余票数:" + ticket--); } } }