我有一个代码,其中each thread
将为10 minutes
工作,它将决定我应该根据random number
选择哪张表。之后,我使用PreparedStatement
为该表执行SQL query
。执行它之后,只有在ResultSet
中存在数据并在List<String> colData
中添加数据时,我需要遍历result set
。列表<String>的添加方法是线程安全还是不安全?
这里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
的方式中还有其他问题吗?由于它是一个多线程代码,因此很难在任何竞争条件下进行调试。
感谢您的建议。现在接下来的问题是否我需要在我的当前代码中同步?顺便说一句,我已经更新了代码。 – AKIWEB 2013-03-01 01:33:42
你能否建议我是否需要在这里同步或不在ArrayList上?谢谢您的帮助。 – AKIWEB 2013-03-01 03:40:19
如果列表将从多个线程访问,则需要同步。您可以通过在同一个对象上显式同步的代码中进行所有访问,或者通过上述的一种方法自动执行所有访问。 – 2013-03-01 03:45:02