论坛首页 入门技术论坛

关于JAVA多线程之间的数据共享

浏览 8546 次
精华帖 (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并没有在多个线程之间共享。这是为什么呢?
   发表时间:2008-03-08  
请大家回复上面的信息。谢谢
0 请登录后投票
   发表时间:2008-03-08  
还未搞明白
0 请登录后投票
   发表时间: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;
其实就是每一个线程都执行了一遍主程序而已~!线程之间没有叠加等关系,相互对立!
0 请登录后投票
   发表时间:2008-03-09  
创建的五个线程都是相互独立的对象而已,互不相干。如果把i变成类变量就不一样了。
0 请登录后投票
   发表时间:2008-03-09  
倚地屠蛇 写道
创建的五个线程都是相互独立的对象而已,互不相干。如果把i变成类变量就不一样了。

即然是互不相干的,那为什么提到线程安全的问题时,要避免使用实例变量呢?
既然避免使用实例变量,那就应该是多线程对实例变量是共同使用的。
有没有高手回答呢???
0 请登录后投票
   发表时间:2008-03-09  
多线程中有主内存和工作内存之分, 在JVM中,有一个主内存,专门负责所有线程共享数据;而每个线程都有他自己私有的工作内存, 主内存和工作内存分贝在JVM的stack区和heap区。由于java是值传递,因此线程在引用数据时,应该是将数据copy到自己的内存中使用.
0 请登录后投票
   发表时间:2008-03-10  
很简单
你的TEST方法有问题
0 请登录后投票
   发表时间:2008-03-10  
ddandyy 写道
很简单
你的TEST方法有问题

楼上的把理由说出来
0 请登录后投票
   发表时间: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();   
        }   
    }   
}

0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics