我想知道以下作为函数局部变量的workingCopy
是THREAD SAFE
private static final Lock lock = new ReentrantLock();
private final List<String> Ids= new LinkedList<String>();
private void foo(){
List<String> workingCopy = null;
final boolean locked = lock.tryLock();
try
{
workingCopy = new LinkedList<String>(Ids);
Ids.clear();
}
catch (final Exception e)
{
log.debug(e.toString());
}
finally
{
if (locked)
{
lock.unlock();
}
}
for (final String copy: workingCopy)
{ /// }
}
或者有更好的方法来执行以下操作
答案 0 :(得分:5)
是的,只有共享变量(实例数据,静态数据)是互斥的,局部变量是在堆栈上创建的,每次调用都是在不同的内存位置上创建的,所以没有必要与另一个共享
答案 1 :(得分:0)
java函数中的局部变量线程安全
问题涉及多个线程访问本地变量:
本地变量的值
局部变量在声明它们的方法或块之外是不可见的。所以只有&#34;本地&#34;开始的线程发挥作用。如果声明final
,则本地启动的线程只能访问局部变量,但不能更改变量的值。因此,变量的值(原始值或引用值)是安全的。
本地变量引用的对象:
如果局部变量引用了一个不可变对象(例如String
),那么你再没有问题,因为它不能被改变(这是不可变的定义)。如果局部变量引用了一个可变对象(例如LinkedList
),那么在没有同步的情况下它就不会像存储在实例或类属性中的任何其他对象那样是线程安全的 - 没有区别。
引用的对象可以作为参数传递给其他方法,然后它就会出现在你的手中#34;。对象的构造函数也可以这样做,所以即使你不能传递它,你也无法确定。
回到你的问题
多个线程不会访问您的workingCopy
变量,因此没有危险,但原始问题的答案是:它不是线程安全的,因为它不是不可变的。
答案 2 :(得分:0)
当你创建多个线程时,每个线程都会创建自己的堆栈。它们永远不会彼此共享。本地变量保留在这里,所以它们是线程安全的。
当您共享对象时,它们通过引用传递,它们指向相同的内存地址,因此它们必须位于关键会话区域,必须提供外部同步。像@icza提到的,在你的问题中它的线程安全String是不可变的