为什么java 成员变量在多线程中不安全?

Brant_Feng 发布于 2013/05/10 18:09
阅读 1K+
收藏 0

运行如下代码

package com.telenav.brant.test;

public class Counter {

	/**
	 * @param args
	 */

	public static class Count{
		private int num;
	    public void count() {
	    	//int num = 0;
	        for(int i = 1; i <= 10; i++) {  
	            num += i;  
	        }  
	        System.out.println(Thread.currentThread().getName() + "-" + num);  
	    }  
	}
	
	public static void main(String[] args) {
		Runnable runnable = new Runnable() {
			Count count = new Count();
			public void run() {
                count.count();  
            }  
        };  
        for(int i = 0; i < 10; i++) {  
            new Thread(runnable).start();  
        }  
	}
}

结果是:

Thread-0-55
Thread-2-110
Thread-1-165
Thread-4-220
Thread-3-275
Thread-6-330
Thread-8-385
Thread-5-440
Thread-7-495
Thread-9-550
为什么会相加起来,不同实例的成员变量互不相干啊,为什么会受到影响了呢?

加载中
0
书一
书一
你虽然for了10次,当时你使用的还是同一个runable对象,只是启动了start次而已
0
Brant_Feng
Brant_Feng

引用来自“廖凯”的答案

你虽然for了10次,当时你使用的还是同一个runable对象,只是启动了start次而已
草!晕死,多谢多谢!看晕我了。
书一
书一
13设置下最佳答案吧、
0
goto-array
goto-array
Runnable runnable = new Runnable() {
    public void run() {
        Count count = new Count();
        count.count();  
    }  
};  
for(int i = 0; i < 10; i++) {  
    new Thread(runnable).start();  
}

// or

for(int i = 0; i < 10; i++) {  
    new Thread(
        new Runnable() {
            Count count = new Count();
            public void run() {
            	count.count();  
            }  
        }
    ).start();  
}
返回顶部
顶部