黑马程序员技术交流社区
标题:
多线程问题
[打印本页]
作者:
曾祥旭
时间:
2013-3-26 19:13
标题:
多线程问题
本帖最后由 曾祥旭 于 2013-3-27 06:34 编辑
class Ticket implements Runnable{
private int tick=100;
public void run(){
while(true){
if(tick>0){
System.out.println(Thread.currentThread().getName()+"--"+tick--);
}
}
}
}
public class Test{
public static void main(String[] args){
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();
}
}
在上述代码中,有四个线程对tick进行操作,当Thread-0线程中的tick为1的时候,此时切换到Thread-1号线程的时候,为什么tick的也为1,这个1不是给Thread-0线程使用了吗?
作者:
程宁宁
时间:
2013-3-26 19:23
涉及到线程同步的问题了.....
你这个现象可以这么解释:
当Thread-0执行 t-- ,还没自减时,Thread-1刚好读取了t的值.
Thread-0打印输出1,那么Thread-1也刚好打印输出1;
作者:
袁梦希
时间:
2013-3-26 21:08
楼主你好 这道题涉及了线程安全方面的知识。
首先这段代码开启了四个线程执行run方法中的代码,线程本身是随机的
假设tick=1时,当cpu执行Thread-0(线程0)时,tick=1进入run方法,满足if条件,线程0没等输出呢,线程0被的执行权被线程1(当然线程2,线程3也可以抢走,你这里指的是线程0和线程1的问题,我们只是假设)抢走了。线程0只具备执行资格,而执行权被线程1抢去了,线程1没等输出呢,线程2也可能会以此类推。
所以当他们同时具备执行权的时候,就会同时输出,也就是你说的打印相同的1。
由此引出了以后要学习的同步知识。
作者:
余善航
时间:
2013-3-26 23:23
你这线程代码没有同步,当多个线程在执行时,实际就是在抢CPU的执行权而已,当0线程运行 刚过if判断就失去了执行资格,
这时线程1 开始运行,同样 满足if判断 然后打印 ,
这时 线程0在打印 打印 ,
所以当多线程访问共享数据时,一定要加锁
作者:
HM朱蛟
时间:
2013-3-27 03:33
本帖最后由 HM朱蛟 于 2013-3-27 04:03 编辑
楼主你好
我用你的代码 在我这里运行了多次 没有出现过楼主所说的 2个线程为同一数值的情况 即 Thread-0 / Thread-1 都为同一个数值的情况
你在if里面加一条这个 try{Thread.sleep(10);} catch(Exception e){} 现象应该会比较明显一点
if(tick>0)
{
try{Thread.sleep(10);} catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"--"+tick--);
}
原理就是上面几位说的那样
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2