通常,同时调用使用局部变量的实例方法是否仅与线程安全有关?
这是一个简短的例子。将调用多个线程a()
;。
public class A {
public boolean a(File file) throws Exception {
boolean t = true;
FileInputStream fin = null;
BufferedInputStream bin = null;
try {
fin = new FileInputStream(file);
bin = new BufferedInputStream(fin);
while(bin.read() > 0) {}
return t;
finally {
try {
if (in != null) in.close();
} catch (IOException e) {}
try {
if (fin != null) fin.close();
} catch (IOException e) {}
}
}
}
调用方法时,局部变量驻留在单个
调用的堆栈中,因此在多
线程的情况下也不必担心局部变量,但是如果File将其作为
参数传递,则可能会产生问题。
创建线程时,它将创建自己的堆栈。两个线程
将具有两个堆栈,并且一个线程永远不会与其他
线程共享其堆栈。
局部变量始终是线程安全的。但是请记住,
局部变量指向的对象可能并非如此。如果对象是在
方法内部实例化的,并且从未转义,则不会有问题。
另一方面,指向某些共享库的局部变量可能
仍然会引起问题。仅仅因为您将共享对象分配给本地
引用,并不意味着该对象自动成为线程安全的。
如果局部变量是原始变量,则是的,它是线程安全的。如果
局部变量是指向本地创建
对象的引用,则可以,它应该是线程安全的(假定静态变量是线程
安全的)。
如果局部变量是指向外部创建的
对象的引用,则且仅当可以以
线程方式安全使用该对象时,该变量才是线程安全的。
问题内容: 我想知道一个类的每个实例是否在该类中都有自己的方法副本? 可以说,我有以下课程: 因此,如果两个不同的用户创建了like这样的实例: 是否知道每个用户在其线程中都有的方法的副本?如果是,则实例变量是线程安全的,只要只有实例方法对其进行操作,对吗? 我问这个问题是因为我经常读到实例变量不是线程安全的。而且,当每个用户通过调用运算符获取实例时,我不明白为什么会这样? 问题答案: 每个对象都
问题内容: 我有一个关于可变范围的问题。 例如: 现在,我创建两个线程,并为每个线程创建一个实例。 当我在每个线程中调用时,可以保证线程安全吗? 本地变量存储在哪里?每个线程的堆栈?堆空间? PS我知道在这种情况下,静态是毫无意义的。我在我们的旧代码中找到了它;我只是想确定我所知道的! 问题答案: 局部变量存储在每个线程自己的堆栈中。这意味着局部变量永远不会在线程之间共享。这也意味着所有本地原始变
问题内容: 我有一个简单的方法返回一个。 它还创建了一个本地。我想测试添加到本地的值。 这是一个例子 将新增至本地时,如何测试? 问题答案: 这不是那么容易。 您需要使用powermock之类的东西。 使用powermock可以在调用方法并进行播放之前创建一个场景,这意味着您可以告诉类构造函数预期被调用并返回a 而不是real 。 这将允许您在上断言。 这样的事情应该起作用: 因此,当您的方法创建
问题内容: 我正在测试下面的代码段,我需要知道如何访问tx或t.hello?它的范围是什么?开发人员是否以这种方式定义变量? 编辑 但是为什么这个片段起作用 问题答案: 您应该区分声明和定义。 在您的情况下,您声明一个class变量,并将其分配给派生自某个类的对象(这是一个匿名类),该对象中包含一些其他内容。 此定义之后的代码仅看到类,它对此一无所知,因为没有它们。 因此,除了反射之外,您不能使用
问题内容: 嗨,我正在浏览有关内部类的SCJP书,发现了这一说法,类似这样。 方法本地类只能引用已标记的本地变量 在解释中,指定的原因与本地类对象和堆上的局部变量的范围和生存期有关,但我无法理解。我在这里想念任何东西吗? 问题答案: 原因是,在创建方法本地类实例时,编译器实际上会将其引用的所有方法本地变量复制到其中。这就是为什么只能访问变量的原因。甲变量或参考是不变的,所以它停留在同步与其方法本地
问题内容: 我读到Java为类属性提供了默认值,但没有为局部变量提供默认值。那是对的吗?如果是这样,背后的原因是什么?当您做某件事时,为什么不一直这样做呢? 谢谢你, 罗杰 问题答案: 标准局部变量存储在堆栈中,直到初始化后才真正创建。如果未使用局部变量,则它不会进入堆栈。但是,成员变量在堆中分配,因此具有默认的占位符(空引用或默认原语)。