私はこのようなHashMapを持っています-
HashMap<String, TableConnectionInfo> tableList
つまり、その値は次のTableConnectionInfo
ようなクラスです-
public class TableConnectionInfo {
public String url;
public String user;
public String password;
public String driver;
public String suffix;
public String sql;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
}
メインスレッドでは、このようにプロパティファイルから上記のマップを読み取ってデータを入力していますが、その後、このマップは変更されません。
for (String arg : databaseNames) {
TableConnectionInfo ci = new TableConnectionInfo();
String url = prop.getProperty(arg + ".url");
String user = prop.getProperty(arg + ".user");
String password = prop.getProperty(arg + ".password");
String driver = prop.getProperty(arg + ".driver");
String suffix = prop.getProperty(arg + ".suffix");
String sql = prop.getProperty(arg + ".sql");
ci.setUrl(url);
ci.setDriver(driver);
ci.setPassword(password);
ci.setSql(sql);
ci.setSuffix(suffix);
ci.setUser(user);
tableList.put(arg, ci);
}
現在、このマップをこのようなさまざまなスレッドに渡してtableList
いますが、どのスレッドによっても(set呼び出しを行うことによって)変更されることはありません。各スレッドはgetメソッドを使用して必要なメソッドを取得します。
for (int i = 0; i< 1000; i++) {
service.submit(new Task(tableList));
}
以下は、RunnableInterfaceを実装する私のタスククラスです
class Task implements Runnable {
private Connection[] dbConnection = null;
private CallableStatement[] callableStatement = null;
private ArrayList<Method> methods[] = null;
private final HashMap<String, TableConnectionInfo> tableLists;
public Task(HashMap<String, TableConnectionInfo> tableList) {
this.tableLists = tableList;
}
@Override
public void run() {
try {
int j = 0;
dbConnection = new Connection[tableLists.size()];
callableStatement = new CallableStatement[tableLists.size()];
methods = new ArrayList[tableLists.size()];
for (TableConnectionInfo ci : tableLists.values()) {
dbConnection[j] = getDBConnection(ci.getUrl(), ci.getUser(), ci.getPassword(), ci.getDriver());
callableStatement[j] = dbConnection[j].prepareCall(ci.getSql());
methods[j] = getRequiredMethods(ci.getSuffix());
j++;
}
}
}
}
質問:-
今私の質問は-私の実行メソッドでは、TableConnectionInfo
クラスのgetメソッドを呼び出しているので、スレッドセーフかどうか?複数のスレッドがget呼び出しを行おうとするため。だから私はここで何か特別なことをする必要があるかどうかわかりませんか?または、コードは正常に見えますか?