java - Thread中List的内存范围

标签 java multithreading list memory

我正在编写一个包含列表的类。我正在从 Runnable 的运行方法实例化列表。作为:

public void sendEmailToLegalUsers() {
    Log.info("JYM====================================");

    try {
        new Runnable() {

            public void run() {
                userCns = new ArrayList<String>();
                recipients = new ArrayList<String>();

                ///other codes
            }
        };                  
    } catch (Exception e) { 
        Log.info("Error occurred in LDAPSendMail: "+ e.getMessage());
    }   

    Log.info("END====================================");
}

现在每次调用 sendEmailToLegalUsers 方法时都会有一个新线程。现在我想知道列表的内存范围是否限制在类级别(如果它限制在类级别并且如果说这个方法被调用两次那么当线程 1 创建的列表也有a Thread 2) 或者当线程在自己的范围内运行时,列表将对每个线程具有不同的范围。是否有机会在两个或多个线程之间混淆列表数据?

最佳答案

如果您为两个线程使用相同的 Runnable 类,那么是的,将会有重叠。如果您的每个线程都有一个单独的 new Runnable() 那么不,它们将是单独的列表实例但是这仅在列表被定义为本地的情况下Runnable。如果列表是在调用类中定义的,那么在您第二次调用您的方法时,userCnsrecipients 字段将被覆盖。

在您的情况下,我根本没有看到任何线程被 fork 。我只看到你实例化了 Runnable。你确定你不是在尝试做类似的事情吗:

    new Thread(new Runnable() {
        public void run() {
            // lists are local to the runnable
            List<String> userCns = new ArrayList<String>();
            List<String> recipients = new ArrayList<String>();
           ///other codes
        }
    }).start();

在这种情况下,每次调用 sendEmailToLegalUsers() 方法时,都会创建一个包含新列表的新 Runnable

关于java - Thread中List的内存范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12180407/

相关文章:

java - 在 JFreeChart x 轴上绘制数据库中给定的时间戳

c# - 如何在 MSTest 中处理 currentDomain.UnhandledException

c++ - "mutex"和 "lock"有什么区别?

c# - LinkedList 节点的任务

java - 检测 JSON 对象列表中的重复条目

java - 无法使用 Spring 的 WebServiceTemplate 将 Http header 添加到消息中

java - 从java函数中部分应用函数

java - Java-7 中的自定义包装异常与 Multi-Catch

list - 在 Prolog 中实现 "last"

list - 排序列表 flutter