java - List<String> 的 add 方法是否线程安全?

标签 java multithreading arraylist thread-safety

我有一个代码,其中 each thread将适用于 10 minutes它将根据 random number 决定我应该选择哪个表。然后我正在执行 SQL query对于该表,使用 PreparedStatement 。执行后,我需要循环遍历 result set仅当数据存在于 ResultSet 中时并将数据添加到List<String> colData中。

这里 columnsList将包含 table columns以逗号分隔。例如-

col1, col2, col3

下面是代码-

class ReadTask implements Runnable {

    private static Random random = new SecureRandom();

    public ReadTask() {

    }    


    @Override
    public run() {
      ...

      while ( < 10 minutes) {

        double randomNumber = random.nextDouble() * 100.0;
        ReadTableConnectionInfo tableInfo = selectRandomConnection(randomNumber);

        final int id = generateRandomId(random);
        final String columnsList = getColumns(table.getColumns());
        final String selectSql = "SELECT " + columnsList + "  from " + table.getTableName() + " where id = ?";

        preparedStatement = tableStatement.get(table.getTableName()).prepareCall(selectSql);
        preparedStatement.setString(1, String.valueOf(id));

        rs = preparedStatement.executeQuery();

        List<String> colData = new ArrayList<String>(columnsList.split(",").length);
        boolean foundData = false;

        if (id >= 1 && id <= 5000) {

            if (rs.next()) {
                foundData = true;

                for (String column : columnsList.split(",")) {

                         colData.add(rs.getString(column)); 
                }
                rs.next();//this should return false or an error condition and do I need this here?
            }
        } else if (rs.next()) {
            // do some stuff
         }

        if (flagValidateData && foundData) {

        // iterate through colData map
             }
         }
       }
    }

问题陈述:-

1) 我的 colData list 是否需要同步还是不?

2)我的方式是否将数据添加到List<String> colData中线程安全吗?

3)我循环结果集并将其添加到 colData string array 的方式是否还有其他问题? ?鉴于此,它是多线程代码,因此很难针对任何竞争条件对其进行调试。

最佳答案

add方法是否多线程安全取决于实现类。 ArrayList 不是多线程安全的。 Vector 是同步的,或者您可以使用 Collections.synchronizedList 方法包装 ArrayList。

关于java - List<String> 的 add 方法是否线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15148828/

相关文章:

java - 使用arrayList在JTextArea中显示

java - 接缝导航规则。捕获所有无效 URL 并重定向到 404 页面

java - NotFound 无法转换为 Throwable

java - 在 Java 中,我仅对单个 JComponent(及其子组件)使用不同的 LookAndFeel

java - 在线程 "main"java.lang.IndexOutOfBoundsException : No group 1 中得到异常

c++ - 在 C++ 中为多个线程创建 lambda 的开销

Java:Junit 测试和 ArrayList

python - 为现有图形创建 matplotlib 交互式绘图窗口

c++ - 由在 DTor 之前删除的静态对象创建的线程?

java - 某处缺少返回语句?