作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我拥有的 3 个类的示例(Start 是带有 main() 的类):
class A{
protected Map<String, String> map;
public A(File input){
map = new HashMap<String, String>();
updateMap(input);
}
private void updateMap(File input){..}
}
class Start{
private MultiThreadedClass newThread;
...
for(int i=0;i< numOfThreads; i++)
newThread = MultiThreadedClass(file[i]);
newThread.start();
}
class MultiThreadedClass extends Thread{
...
public void run(){
A a = new A(file);
}
}
这是我的问题 - 每个线程都有一个不同的文件,它的工作是执行 updateMap 方法并根据该文件更新 map 。该映射必须仅包含一个文件中的值。给定的实现是否强制执行这一点?当实现这个时,我的想法是,每个线程的新 A() 调用将保证每个线程都有自己的映射,即使两个线程同时更新映射,每个线程也只更新自己的副本。但我不确定这是否正确。
谢谢!
最佳答案
你的预感是正确的。每次调用“new ClassName”时,都会在内存中为您指定的 ClassName 的对象分配空间。其他线程能够访问此内存的唯一方法是您使其可用,或者将其作为参数传递给另一个函数,将其引用分配给线程类的公共(public)成员变量,或者从公共(public)成员函数返回它您的线程类(将其分配给您的类的成员字段之后)。
由于您已在 run 函数中本地创建了该对象,并且您没有保留对 A 类的任何引用作为 Thread 类的成员,因此其他人可以获取 A 对象的唯一方法是:您将它作为参数传递给另一个方法,该方法会执行一些操作来保留该值。
当 run 函数完成并且执行退出该方法时,A 对象将不再存在,您在 A 对象内部创建的 Map 也将不再存在。
关于java - 如何在多线程环境中强制每个对象都有自己的状态? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4801974/
我是一名优秀的程序员,十分优秀!