List <string>的add方法是否是线程安全的?</string>

时间:2013-03-01 01:22:09

标签: java multithreading arraylist thread-safety

我有一个each thread适用于10 minutes的代码,它将根据random number决定我应该选择哪个表格。{1}}之后我使用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的方式中是否还有其他问题?由于它是一个多线程代码,因此很难在任何竞争条件下调试它。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

您可以使任何List线程安全如下:

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

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

答案 2 :(得分:0)

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

我妈妈的感觉是德语(aut / vie),它是3 ...;)

sync用于可以覆盖数据或由多次访问替换的数据 如果你有同步的东西,它可以制动你的系统(加速) 的Cuz:

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

如果你有一个线程可以访问某个方法,下一个线程必须等到前面的线程完成了

部分

一个很好的例子: 使用流将数据写入单个文件并将一些数据写入文件或输出连接: public synchronized void write(OutputStream str,byte toSend []){...}

我通常使用synchronized for pool-techniques,例如get-next-operation(list-removal,return last element)

我已经厌倦了18个小时的工作;)

我只是说:

无论你需要同步,都要为它编写一个函数 e.g。

public synchronized void colData_add(final String str) // or object or whatever
{
...
}

public synchronized String colData_nextElement()
{
return colData.remove();
}

希望这有帮助