0

我有一个适用于其中的代码,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?鉴于此,它是一个多线程代码,因此很难针对任何竞争条件对其进行调试。

4

3 回答 3

3

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

于 2013-03-01T01:26:41.357 回答
2

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

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

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

于 2013-03-01T01:29:30.150 回答
0

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

我妈妈的舌头是德国人(aut/vie),它是 3……;)

同步用于数据可以被覆盖或被多次访问替换的地方,如果你有同步的东西,它可以让你的系统停止(减速)因为:

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

如果您有一个线程女巫访问某些方法,下一个线程必须等到之前的线程完成该部分

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

我通常将同步用于池技术,例如 get-next-operation (list-removal, return last element)

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

我只是说:

无论您必须同步什么,都为其编写一个函数,例如

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

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

希望这有帮助

于 2013-03-01T02:13:06.820 回答