有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java函数中的局部变量是线程安全的吗

我想知道下面的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)
        { /// }
} 

还是有更好的方法来完成以下工作


共 (3) 个答案

  1. # 1 楼答案

    创建多个线程时,每个线程都将创建自己的堆栈。他们从不分享彼此。局部变量保留在这里,因此它们是线程安全的

    共享对象时,它们是通过引用传递的,它们指向相同的内存地址,所以它们必须位于关键会话区域,必须提供外部同步。就像@icza提到的,在您的问题中,它的线程安全字符串是不可变的

  2. # 2 楼答案

    Is a local variable inside a java function thread safe

    问题涉及多个线程访问局部变量:

    局部变量的值:

    局部变量在声明它们的方法或块之外不可见。因此,只有“本地”启动的线程才起作用。本地启动的线程只能访问声明为final的本地变量,但不能更改该变量的值。因此变量的值(原语或引用)是安全的

    局部变量引用的对象:

    如果局部变量引用了一个不可变的对象(比如String),那么同样没有问题,因为它不能被更改(这是不可变的定义)。如果局部变量引用一个可变对象(例如LinkedList),那么如果没有同步,它就不会像存储在实例或类属性中的任何其他对象一样是线程安全的——没有区别
    被引用的对象可以作为参数传递给其他方法,然后它就“不在你的掌控之中”。对象的构造函数可能也会这样做,即使您不传递它,您也无法确定

    回到你的问题

    您的workingCopy变量不是由多个线程访问的,因此没有危险,但原始问题的答案是:它不是线程安全的,因为它不是不可变的

  3. # 3 楼答案

    是的,只有共享变量(实例数据、静态数据)是互斥的,局部变量是在堆栈上创建的,每次调用时,都是在不同的内存位置创建的,因此没有必要彼此共享