java函数中的局部变量是线程安全的吗
我想知道以下函数的局部变量java函数中的局部变量是线程安全的吗,java,Java,我想知道以下函数的局部变量workingCopy是否是线程安全的 private static final Lock lock = new ReentrantLock(); private final List<String> Ids= new LinkedList<String>(); private void foo(){ List<String> workingCopy = null; final bool
workingCopy
是否是线程安全的
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)
{ /// }
}
private static final Lock=new ReentrantLock();
private final List id=new LinkedList();
私人文件{
列表工作副本=空;
final boolean locked=lock.tryLock();
尝试
{
workingCopy=新链接列表(ID);
Ids.clear();
}
捕获(最终异常e)
{
debug(例如toString());
}
最后
{
如果(已锁定)
{
lock.unlock();
}
}
用于(最终字符串副本:工作副本)
{ /// }
}
或者有更好的方法来执行以下操作吗?是的,只有共享变量(实例数据、静态数据)是互斥的,局部变量在堆栈上创建,每次调用时都在不同的内存位置上创建,因此没有必要彼此共享。是的,只有共享变量(实例数据、静态数据)都是互斥的,局部变量是在堆栈上创建的,每次调用都是在不同的内存位置上创建的,所以没有必要彼此共享
是java函数中的局部变量线程安全
问题涉及多个线程访问局部变量:
局部变量的值:
局部变量在声明它们的方法或块之外不可见。因此,只有“本地”启动的线程才起作用。本地启动的线程只能访问声明为final
的本地变量,但不能更改该变量的值。因此变量的值(原语或引用)是安全的
局部变量引用的对象:
如果局部变量引用不可变对象(例如String
),那么同样没有问题,因为它不能更改(这是不可变的定义)。如果局部变量引用一个可变对象(如LinkedList
),那么如果没有同步,它就不会像存储在实例或类属性中的任何其他对象一样是线程安全的-没有区别。
被引用的对象可以作为参数传递给其他方法,然后它就“不在您的掌握之中”。对象的构造函数也可能这样做,即使您不传递它,您也不能确定
回到你的问题
您的workingCopy
变量不是由多个线程访问的,因此没有危险,但原始问题的答案是:它不是线程安全的,因为它不是不可变的
是java函数中的局部变量线程安全
问题涉及多个线程访问局部变量:
局部变量的值:
局部变量在声明它们的方法或块之外不可见。因此,只有“本地”启动的线程才起作用。本地启动的线程只能访问声明为final
的本地变量,但不能更改该变量的值。因此变量的值(原语或引用)是安全的
局部变量引用的对象:
如果局部变量引用不可变对象(例如String
),那么同样没有问题,因为它不能更改(这是不可变的定义)。如果局部变量引用一个可变对象(如LinkedList
),那么如果没有同步,它就不会像存储在实例或类属性中的任何其他对象一样是线程安全的-没有区别。
被引用的对象可以作为参数传递给其他方法,然后它就“不在您的掌握之中”。对象的构造函数也可能这样做,即使您不传递它,您也不能确定
回到你的问题
您的workingCopy
变量没有被多个线程访问,因此没有危险,但原始问题的答案是:它不是线程安全的,因为它不是不可变的。当您创建多个线程时,每个线程将创建自己的堆栈。它们从不共享彼此。局部变量保留在这里,因此它们是线程安全的
当你们共享对象时,它们是通过引用传递的,它们指向相同的内存地址,所以它们必须在关键会话区域,必须提供外部同步。就像前面提到的@icza一样,在您的问题中,它的线程安全字符串是不可变的当您创建多个线程时,每个线程都将创建自己的堆栈。它们从不彼此共享。局部变量保留在这里,因此它们是线程安全的
当你们共享对象时,它们是通过引用传递的,它们指向相同的内存地址,所以它们必须在关键会话区域,必须提供外部同步。正如@icza所提到的,在您的问题中,它的线程安全字符串是不可变的。是的,它是java..updated.My bad。是的,它的java更新了。