有 Java 编程相关的问题?

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

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

我有一个代码,其中each thread将用于10 minutes,它将决定我应该根据random number选择哪个表。然后,我使用PreparedStatement为该表执行SQL query。执行它之后,仅当数据在ResultSet中时,我需要在result set中循环,并将数据添加到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的方式中是否存在任何其他问题?鉴于此,它是一个多线程代码,因此很难针对任何竞争条件对其进行调试


共 (3) 个答案

  1. # 1 楼答案

    add方法是否是多线程安全的取决于实现类。ArrayList不是多线程安全的。向量是同步的,或者可以使用集合包装ArrayList。同步列表方法

  2. # 2 楼答案

    您可以像这样使任何List线程安全:

    List<String> names = new ArrayList<String>(); // not thread safe
    List<String> threadSafeNames = Collections.synchronizedList(names);
    

    更好的解决方案可能是来自java.util.concurrent的新数据结构,如CopyOnWriteArrayList

  3. # 3 楼答案

    如果您需要同步数据,为什么不编写一个同步读写函数呢? 如果扩展集合和列表,它们也可以同步

    我妈妈的TONGE是德语(aut/vie),它是3…;)

    同步用于数据可以被多个访问覆盖或替换的情况 如果你有同步的东西,它可以刹车你的系统(加速) 因为:

    同步意味着只有一个对象可以处理某些部分

    如果有一个线程访问某个方法,那么下一个线程必须等到前面的线程完成该节

    一个很好的例子: 使用流将数据写入单个文件,并将一些数据写入文件或输出连接: 公共同步的无效写入(OutputStream str,byte-toSend[]){…}

    我通常使用synchronized作为池技术,例如获取下一个操作(列表删除、返回最后一个元素)

    我厌倦了18小时的工作

    我只是说:

    无论需要同步什么,都要为它编写一个函数 e、 g

    public synchronized void colData_add(final String str) // or object or whatever
    {
    ...
    }
    
    public synchronized String colData_nextElement()
    {
    return colData.remove();
    }
    

    希望这有帮助