锁定老帖子 主题:关于JAVA多线程之间的数据共享
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-03-08
package test; public class ThreadDemo extends Thread{ private int i = 0; @Override public void run() { System.out.println(this +":" + ++i); } public static void main(String[] args){ for(int i=0;i<5;i++){ ThreadDemo t = new ThreadDemo(); t.start(); } } } 上面的代码我生成了五个线程。每个线程启动的时候,把实例变量+1然后打印,就得到了下面的结果 Thread[Thread-0,5,main]:1 Thread[Thread-1,5,main]:1 Thread[Thread-2,5,main]:1 Thread[Thread-3,5,main]:1 Thread[Thread-4,5,main]:1 从这里看,好像每个线程都独自拥有一个变量i。而变量i并没有在多个线程之间共享。这是为什么呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-03-08
请大家回复上面的信息。谢谢
|
|
返回顶楼 | |
发表时间:2008-03-08
还未搞明白
|
|
返回顶楼 | |
发表时间:2008-03-09
我的个人浅见:
第一个线程创建---i=0---(i++)----i=1; 第二个线程创建---i=0---(i++)----i=1; 第三个线程创建---i=0---(i++)----i=1; 第四个线程创建---i=0---(i++)----i=1; 第五个线程创建---i=0---(i++)----i=1; 其实就是每一个线程都执行了一遍主程序而已~!线程之间没有叠加等关系,相互对立! |
|
返回顶楼 | |
发表时间:2008-03-09
创建的五个线程都是相互独立的对象而已,互不相干。如果把i变成类变量就不一样了。
|
|
返回顶楼 | |
发表时间:2008-03-09
倚地屠蛇 写道 创建的五个线程都是相互独立的对象而已,互不相干。如果把i变成类变量就不一样了。 即然是互不相干的,那为什么提到线程安全的问题时,要避免使用实例变量呢? 既然避免使用实例变量,那就应该是多线程对实例变量是共同使用的。 有没有高手回答呢??? |
|
返回顶楼 | |
发表时间:2008-03-09
多线程中有主内存和工作内存之分, 在JVM中,有一个主内存,专门负责所有线程共享数据;而每个线程都有他自己私有的工作内存, 主内存和工作内存分贝在JVM的stack区和heap区。由于java是值传递,因此线程在引用数据时,应该是将数据copy到自己的内存中使用.
|
|
返回顶楼 | |
发表时间:2008-03-10
很简单
你的TEST方法有问题 |
|
返回顶楼 | |
发表时间:2008-03-10
ddandyy 写道 很简单
你的TEST方法有问题 楼上的把理由说出来 |
|
返回顶楼 | |
发表时间:2008-03-10
zym_nanako 写道 ddandyy 写道 很简单
你的TEST方法有问题 楼上的把理由说出来 用这个再试。 public class ThreadDemo implements Runnable { private int i = 0; public void run() { System.out.println(this +":" + ++i); } public static void main(String[] args){ ThreadDemo r = new ThreadDemo(); for(int i=0;i<5;i++){ Thread t = new Thread(r); t.start(); } } } |
|
返回顶楼 | |