Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程中的实例对象是否可以访问相同的静态类和变量?_Java_Constructor_Static - Fatal编程技术网

Java 多线程中的实例对象是否可以访问相同的静态类和变量?

Java 多线程中的实例对象是否可以访问相同的静态类和变量?,java,constructor,static,Java,Constructor,Static,如果在我的主类中创建这样一个对象:Tools tool=newtools()在Tools构造函数中,我会执行以下操作: Web web; public Tools(){ web = new Web(); } 每个线程的工具对象是否引用同一个web?我需要他们都有一个不同的网站的参考。Web是一个静态类,它使用Web驱动程序执行操作,这就是为什么我需要它们都是分开的 每个线程的工具对象都引用同一个web吗 所有线程都可以访问相同的引用(前提是它们都可以访问相同的工具实例),但由于内存模型

如果在我的主类中创建这样一个对象:
Tools tool=newtools()
Tools
构造函数中,我会执行以下操作:

Web web;
public Tools(){
    web = new Web();
}
每个线程的
工具
对象是否引用同一个web?我需要他们都有一个不同的
网站的参考
。Web是一个静态类,它使用Web驱动程序执行操作,这就是为什么我需要它们都是分开的

每个线程的工具对象都引用同一个web吗

所有线程都可以访问相同的引用(前提是它们都可以访问相同的
工具实例),但由于内存模型的可见性,它们不一定会看到相同的值

如果您声明
web
成员
final
,它们将看到相同的值

我需要他们都有一个不同的
网站的参考

在这种情况下,您需要使用一个

ThreadLocal web=ThreadLocal.withInitial(web::new);

每个工具实例都有自己的Web实例。不同的线程使用同一个工具实例吗?是的,任何一个工具实例都有自己的Web或者应该有自己的Web。没有,每个线程都有一个
newtools()
如果每个线程都有一个
newtools
,那么线程就不会共享
Web
的实例。即使Web类中的Web和所有变量都是静态的,这种情况也会发生。在您发布的代码中,
Web
是一个实例字段,而不是静态字段。我说不出我没见过的代码是如何工作的。但是,如果
Web
中的所有字段都是静态的,那么
Web
的实例数量可能与此无关,您必须重写它以使其线程安全。这将使每个线程都有自己的Web实例?+1'd表示
ThreadLocal
,但可能值得在“如果它们不能访问相同的
工具
实例”上添加一条注释。根据OP的评论,每个线程都会创建自己的工具实例。因此,似乎不需要ThreadLocal。@khelwood确实如此。我在回答后补充了这一评论。
ThreadLocal<Web> web = ThreadLocal.withInitial(Web::new);