由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 重新学习Java Thread的Field变量与Thread Local
相关主题
Java的多线程的一般问题Java中的memory leak常见的原因有哪几种?
Java 多线程:还需要好CPU?java update main UI from child thread issue (转载)
问题一枚java concurrency时,你们用的callable还是runnable?
怎么练习multi-threading,平常工作都是用Java框架请教一个Java编程问题
Java的服务器一般运行几个线程比较合适?关于多线程编程的一个问题
一个multithread的问题(是不是有人觉的很简单?)问个C++编译器如何处理函数内的static 变量
编程题又一道关于线程读写全局变量的问题
Java 多线程 的架构如何改进?请问多个线程同时访问同一个内存地址会不会使得程序变慢
相关话题的讨论汇总
话题: thread话题: new话题: field话题: runnable话题: 变量
进入Programming版参与讨论
1 (共1页)
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 的大作中提到】
: 他那个写多线程,看得让人捏把汗。
1 (共1页)
进入Programming版参与讨论
相关主题
请问多个线程同时访问同一个内存地址会不会使得程序变慢Java的服务器一般运行几个线程比较合适?
重复利用threads的问题一个multithread的问题(是不是有人觉的很简单?)
Thread Priority 设为最高--窗口最小化时好像并不优先啊?编程题又一道
怎么 kill 一个 thread 啊Java 多线程 的架构如何改进?
Java的多线程的一般问题Java中的memory leak常见的原因有哪几种?
Java 多线程:还需要好CPU?java update main UI from child thread issue (转载)
问题一枚java concurrency时,你们用的callable还是runnable?
怎么练习multi-threading,平常工作都是用Java框架请教一个Java编程问题
相关话题的讨论汇总
话题: thread话题: new话题: field话题: runnable话题: 变量