b***i 发帖数: 3043 | 1 前几天几个高手的提示,脑洞打开,才发现,原来Runnable的变量是共享的!另感谢提
醒,把错误的语法改了
class A {
int a;
A(int x){a=x;}
public void show(){System.out.println(a);}
}
...main(...
A a=new A(3);
A b=new A(4);
a.show();
b.show();
}
这个显示3, 4
但是
class A implements Runnable{
int a;
A(int x){a=x;}
public void run(){
.. wait for one second;
System.out.println(a);
}
}
.. main(..
A a=new A(3);
A b=new A(4);
Thread t1=new Thread(a);
Thread t2=new Thread(b)'
t1.start();t2.start();
}
这个显示两个3
所以才有ThreadLocal的介入。不过,ThreadLocal由于是static变量实现Field的能力
,可以在类外被呼叫的函数里直接调用从而取得Thread构造或者开始的时候设置的参数
。可以在不修改程序总体设计的前提下把参数直接取得。当然,把参数一层层传入也是
可以的。 |
p***o 发帖数: 1252 | 2 还是先去看java concurrency in practice吧
【在 b***i 的大作中提到】 : 前几天几个高手的提示,脑洞打开,才发现,原来Runnable的变量是共享的!另感谢提 : 醒,把错误的语法改了 : class A { : int a; : A(int x){a=x;} : public void show(){System.out.println(a);} : } : ...main(... : A a=new A(3); : A b=new A(4);
|
c*********e 发帖数: 16335 | 3 有你这么初始化一个class的吗?
A a(3);
A b(4);
如果是我,这么写:
A a = new A(3);
A b = new A(4);
【在 b***i 的大作中提到】 : 前几天几个高手的提示,脑洞打开,才发现,原来Runnable的变量是共享的!另感谢提 : 醒,把错误的语法改了 : class A { : int a; : A(int x){a=x;} : public void show(){System.out.println(a);} : } : ...main(... : A a=new A(3); : A b=new A(4);
|
b***i 发帖数: 3043 | 4 多谢提醒,已经修改
【在 c*********e 的大作中提到】 : 有你这么初始化一个class的吗? : A a(3); : A b(4); : 如果是我,这么写: : A a = new A(3); : A b = new A(4);
|
c*********e 发帖数: 16335 | 5 改了后还是显示2个3 ?
感觉你不是科班出身的。科班的绝对不会犯这种错误。
【在 b***i 的大作中提到】 : 多谢提醒,已经修改
|
b***i 发帖数: 3043 | 6 奇怪的就是这个
本来两个实例变量应该有不同的i,但是java的线程就是让两个线程拥有同一个i,从而
可以容易共享。不想共享要用ThreadLocal。
我还没明白为什么要这样。为什么不能用static来共享?
【在 c*********e 的大作中提到】 : 改了后还是显示2个3 ? : 感觉你不是科班出身的。科班的绝对不会犯这种错误。
|
b***i 发帖数: 3043 | 7 本来上周做了实验是这样的,才发表本文。
结果,刚才在网上编译,结果和我本文说的不一样,线程的私有成员确实是私有的。(
是吗?)然后,在本地编译,也是确实是私有的。
如果是这样还好了,因为我一直是这样理解的,直到上一周不知怎么搞出了错误的结果。
【在 p***o 的大作中提到】 : 还是先去看java concurrency in practice吧
|
c*********e 发帖数: 16335 | 8 private final int a;
看这样还是不是2个3.
【在 b***i 的大作中提到】 : 奇怪的就是这个 : 本来两个实例变量应该有不同的i,但是java的线程就是让两个线程拥有同一个i,从而 : 可以容易共享。不想共享要用ThreadLocal。 : 我还没明白为什么要这样。为什么不能用static来共享?
|
b***i 发帖数: 3043 | 9 是我前面写代码有问题。如果生成多个Runnable的实例,那么确实可以保证每个线程有
自己的私有Field.
主要是我看网上的文章,被吓了。他们不停地讲线程安全,其实就是不同的线程共用一
个Runnable的变量,则私有成员变量会共享。用不同的Runnable实例不就行了吗?为什
么那么多人大惊小怪?
不过,ThreadLocal对我那个目的很有用。我是要在线程和Runnable的类之外的函数里
面访问线程有关的信息,可以用ThreadLocal。
【在 c*********e 的大作中提到】 : private final int a; : 看这样还是不是2个3.
|
w**z 发帖数: 8232 | 10 他那个写多线程,看得让人捏把汗。
【在 p***o 的大作中提到】 : 还是先去看java concurrency in practice吧
|
p***o 发帖数: 1252 | 11 所以要看书,这玩艺东一榔头西一棒网上到处看是看不明白的。
【在 w**z 的大作中提到】 : 他那个写多线程,看得让人捏把汗。
|