Redian新闻
>
重新学习Java Thread的Field变量与Thread Local
avatar
重新学习Java Thread的Field变量与Thread Local# Programming - 葵花宝典
l*3
1
新闻讲PRIUS也有突发进的问题,
之前有一起灾难的肇事司机被释放,他驾驶的PRIUS被证明有突发进问题。。。
愿大家都平平安安,节日愉快。。。
avatar
b*i
2
前几天几个高手的提示,脑洞打开,才发现,原来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构造或者开始的时候设置的参数
。可以在不修改程序总体设计的前提下把参数直接取得。当然,把参数一层层传入也是
可以的。
avatar
s*i
3
你是不是在标题加上“安全到家享受美食”之类,跟food搭上线,嗬嗬
avatar
p*o
4
还是先去看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);

avatar
l*3
5
MM聪明,已经改啦。。。

【在 s*******i 的大作中提到】
: 你是不是在标题加上“安全到家享受美食”之类,跟food搭上线,嗬嗬
avatar
c*e
6
有你这么初始化一个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);

avatar
F*t
7
偶家没有
avatar
b*i
8
多谢提醒,已经修改

【在 c*********e 的大作中提到】
: 有你这么初始化一个class的吗?
: A a(3);
: A b(4);
: 如果是我,这么写:
: A a = new A(3);
: A b = new A(4);

avatar
c*e
9
改了后还是显示2个3 ?
感觉你不是科班出身的。科班的绝对不会犯这种错误。

【在 b***i 的大作中提到】
: 多谢提醒,已经修改
avatar
b*i
10
奇怪的就是这个
本来两个实例变量应该有不同的i,但是java的线程就是让两个线程拥有同一个i,从而
可以容易共享。不想共享要用ThreadLocal。
我还没明白为什么要这样。为什么不能用static来共享?

【在 c*********e 的大作中提到】
: 改了后还是显示2个3 ?
: 感觉你不是科班出身的。科班的绝对不会犯这种错误。

avatar
b*i
11
本来上周做了实验是这样的,才发表本文。
结果,刚才在网上编译,结果和我本文说的不一样,线程的私有成员确实是私有的。(
是吗?)然后,在本地编译,也是确实是私有的。
如果是这样还好了,因为我一直是这样理解的,直到上一周不知怎么搞出了错误的结果。

【在 p***o 的大作中提到】
: 还是先去看java concurrency in practice吧
avatar
c*e
12
private final int a;
看这样还是不是2个3.

【在 b***i 的大作中提到】
: 奇怪的就是这个
: 本来两个实例变量应该有不同的i,但是java的线程就是让两个线程拥有同一个i,从而
: 可以容易共享。不想共享要用ThreadLocal。
: 我还没明白为什么要这样。为什么不能用static来共享?

avatar
b*i
13
是我前面写代码有问题。如果生成多个Runnable的实例,那么确实可以保证每个线程有
自己的私有Field.
主要是我看网上的文章,被吓了。他们不停地讲线程安全,其实就是不同的线程共用一
个Runnable的变量,则私有成员变量会共享。用不同的Runnable实例不就行了吗?为什
么那么多人大惊小怪?
不过,ThreadLocal对我那个目的很有用。我是要在线程和Runnable的类之外的函数里
面访问线程有关的信息,可以用ThreadLocal。

【在 c*********e 的大作中提到】
: private final int a;
: 看这样还是不是2个3.

avatar
w*z
14
他那个写多线程,看得让人捏把汗。

【在 p***o 的大作中提到】
: 还是先去看java concurrency in practice吧
avatar
p*o
15
所以要看书,这玩艺东一榔头西一棒网上到处看是看不明白的。

【在 w**z 的大作中提到】
: 他那个写多线程,看得让人捏把汗。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。