黑马程序员技术交流社区

标题: 关于多线程,我想问 [打印本页]

作者: heheka123    时间: 2014-3-31 15:52
标题: 关于多线程,我想问
看书看到多线程的时候,书上讲到了线程同步的内容,然后是举了个例子,代码如下
class My implements Runnable{
private int count =0;
public void run(){
test();
}
private void test(){
for(int i=0;i<10;i++){
count++;
Thread.yield();
count--;
System.out.println(count);
}
}

}
public class Test {
public static void main(String args[]) throws InterruptedException{
My t=new My();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
  
t1.start();
t2.start();
}

}
书上给的例子是运行结果变得很奇怪,打印了很多-1,没什么规律,但是我自己测试时全都是0 ,- -。书上后面加了Synchronized关键字说是运行结果全为0,不知道这是为什么。
还有t1,t2不是两个对象么?他们的count为什么是共享的?
嫩鸟求救啊,谢谢了。
作者: osully    时间: 2014-3-31 16:10
第一 你可以把循环次数加大了看,肯定会出现-1的,

第二,t1 跟t2 是两个线程....他们在同时对t对象操作
t.count 是共享的
作者: ehuashao    时间: 2014-3-31 16:13
一。
for(int i=0;i<10;i++){
①count++;
②Thread.yield();
③count--;
④System.out.println(count);
看代码现在线程t1进来运行①然后count=1,②yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。这时候假如线程线程t1继续运行到③,count--=0,然后④输出0,假如现在线程t2进来运行③,由于线程不共享数据,此时count--=-1,然后④输出-1。
你的结果全是0,你把程序多跑几遍,就会看见其他结果了。
二。
当加了同步锁之后,另一个线程想要进来test方法,只能等另一个方法执行完test方法体,所以每个线程都会按照
①②③④的顺序运行完,所以结果只会输出0.
作者: 枫儿    时间: 2014-4-6 19:52
楼主你好,如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2