2013-03-01 63 views
0

我有一个代码,其中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的方式中还有其他问题吗?由于它是一个多线程代码,因此很难在任何竞争条件下进行调试。

回答

3

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

+0

感谢您的建议。现在接下来的问题是否我需要在我的当前代码中同步?顺便说一句,我已经更新了代码。 – AKIWEB 2013-03-01 01:33:42

+0

你能否建议我是否需要在这里同步或不在ArrayList上?谢谢您的帮助。 – AKIWEB 2013-03-01 03:40:19

+0

如果列表将从多个线程访问,则需要同步。您可以通过在同一个对象上显式同步的代码中进行所有访问,或者通过上述的一种方法自动执行所有访问。 – 2013-03-01 03:45:02

2

你可以做任何List线程安全的是这样的:

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

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

+0

感谢您的建议。现在接下来的问题是否我需要在我的当前代码中同步?顺便说一句,我已经更新了代码。 – AKIWEB 2013-03-01 01:33:11

+1

值得注意的是,如果所有操作都是在threadSafeNames而不是名称上执行的,那么这只是线程安全的:该同步列表只是一个包装。 – 2013-03-01 01:37:02

+0

@duffymo,你可以建议我是否需要同步或不在ArrayList上?提前致谢。 – AKIWEB 2013-03-01 03:41:01

0

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

妈妈的舌头是德国(AUT/VIE)和它的3 ...;)

同步使用,其中的数据可以被覆盖或替换多址 如果你有同步的东西,它可以刹车系统出(超速行驶) 的Cuz:

同步方式,即只有一个对象可以处理一些部分

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

一个很好的例子:使用流和写入一些数据文件或 数据写入到一个文件输出连接: 公共同步空隙写(OutputStream的STR,字节toSend []) {...}

我usaly使用同步与池技术,如取得下一个操作(列表删除,返回最后一个元素)

IM累了,在18小时的工作;)

我只想说:

无论你必须同步,写一个函数为它 eg

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

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

希望这个helpz