我有一个代码,其中 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/