A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© heheka123 中级黑马   /  2014-3-31 15:52  /  916 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看书看到多线程的时候,书上讲到了线程同步的内容,然后是举了个例子,代码如下
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为什么是共享的?
嫩鸟求救啊,谢谢了。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

3 个回复

倒序浏览
第一 你可以把循环次数加大了看,肯定会出现-1的,

第二,t1 跟t2 是两个线程....他们在同时对t对象操作
t.count 是共享的
回复 使用道具 举报
一。
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.

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
楼主你好,如果问题已解决,请将帖子改为提问结束,如果没有解决请楼主继续提问,谢谢合作
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马