实现Runnable接口的线程类,很困惑的问题

zl26172768 2012-08-27 09:50:26
public class SecondThread implements Runnable{
int i;
@Override
public void run() {
for(;i<200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);

}

}

public static void main(String[] args) {
for(int i=0;i<30;i++){
//System.out.println(Thread.currentThread().getName()+" "+i);

if(i==20){
SecondThread st=new SecondThread();
new Thread(st,"新线程1").start();
new Thread(st,"新线程2").start();

}

}

}


}

说实现了Runnable接口方式创建的多个线程可以共享线程类的实例属性,上面的代码,我运行了好几遍发现,线程1和线程2都有可能出现相同的i值,既然是共享实例属性,那应该是2个线程共享st的i值,既然都是用的同一个对象的i值,为什么还出现相同的i值呢?那不是与“实现了Runnable接口方式创建的多个线程可以共享线程类的实例属性”这句话矛盾了?求师傅帮忙解惑一下,我晕了一下午了这个点
...全文
174 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsb_csdn 2012-08-27
  • 打赏
  • 举报
回复
请教一下,就是后面的for循环是不是没有用啊,只有run()方法结束了,程序也就结束了???不会说是i没增加1就执行一次线程??[Quote=引用 2 楼 的回复:]

两个线程共享的数据 当然要使用同步控制
[/Quote]
dsb_csdn 2012-08-27
  • 打赏
  • 举报
回复
在方法上面或者块上加synchronized关键字后,防止线程同步。
loverz03 2012-08-27
  • 打赏
  • 举报
回复
加上同步锁
孤雨 2012-08-27
  • 打赏
  • 举报
回复
两个线程共享的数据 当然要使用同步控制
MiceRice 2012-08-27
  • 打赏
  • 举报
回复
并发就是这样,你没有做并发控制,就会有各种灵异现象,因为线程执行是交错执行的。

也就意味着,两个线程可能分别执行了i++后,然后才执行了 println,给个典型交错场景
T1:i++ // i为1
T2:i++ // i为2
T1:System.out.println(Thread.currentThread().getName()+" "+i); // 输出2
T2:System.out.println(Thread.currentThread().getName()+" "+i); // 输出2

要么你就严格的做并发控制,比如:

public void run() {
synchronized(this) {
for(;i<200;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧