日期:2014-05-19  浏览次数:20800 次

请教一个多线程中关于临时变量的问题!
情况一:2个线程 不同的业务 调用的是不同方法 不同方法中使用的都是for(int i,,i++)这种写法 想请教-->这样不同的线程运行时候 线程1的i的循环赋值是否会影响到线程2的赋值!

情况二:两个线程 相同的业务 调用相同方法 两个线程启动运行 想请教-->线程1的i的循环赋值是否会影响到线程2的赋值!

现在在情况一下 线程1执行一个循环 i的赋值会突然被被赋值为0 所以很是纠结 因为业务需求 给方法上线程锁就没有意义了 
------最佳解决方案--------------------
引用:
╮(╯▽╰)╭  现在debug的情况就是 线程1的循环已经走到了i=3了 但是当另外一个线程启动时 线程1的i就变成等0了 问题是 这个两个线程调用的都是不同的方法啊 这样也会串到啊。。。

两个线程操作的都是不同的变量(可以确定吧?)怎么会影响到呢? 确认一下是不是由该线程引起的变化,或者给出相关代码。
------其他解决方案--------------------
首先声明,俺对线程的了解全都是理论上,没有实际在工作中用到过,用到的都是简单的情况。

情况一中,按说应该不会的,没有看具体代码也不知道你后面说的是什么原因。局部不变量有自己的作用域,超过作用域是引用不到的。
是否可以debug一下看看线程的每个步骤里面的调用。
------其他解决方案--------------------
╮(╯▽╰)╭  现在debug的情况就是 线程1的循环已经走到了i=3了 但是当另外一个线程启动时 线程1的i就变成等0了 问题是 这个两个线程调用的都是不同的方法啊 这样也会串到啊。。。
------其他解决方案--------------------
引用:
首先声明,俺对线程的了解全都是理论上,没有实际在工作中用到过,用到的都是简单的情况。

情况一中,按说应该不会的,没有看具体代码也不知道你后面说的是什么原因。局部不变量有自己的作用域,超过作用域是引用不到的。
是否可以debug一下看看线程的每个步骤里面的调用。


很少用线程。。
------其他解决方案--------------------
正在学习中.
------其他解决方案--------------------
引用:
引用:╮(╯▽╰)╭  现在debug的情况就是 线程1的循环已经走到了i=3了 但是当另外一个线程启动时 线程1的i就变成等0了 问题是 这个两个线程调用的都是不同的方法啊 这样也会串到啊。。。
两个线程操作的都是不同的变量(可以确定吧?)怎么会影响到呢? 确认一下是不是由该线程引起的变化,或者给出相关代码。
        ……

public boolean saveSourceDataXML(Integer sourceTableId, Integer destTableId) throws Exception {
initConfig();
SynLogDAO synLogDAO = (SynLogDAO) SpringBeanUtil.getBean("synLogDAO");
MetaTable sourceTable = null; //源数据表对象
MetaTable destTable = null; //目标表对象
List<FieldsMap> userMapping = null; //用户映射字段集合
List<MetaField> sourceFields = null; //源数据表映射字段集合
List<MetaField> destFields = null; //目标表映射字段集合

sourceTable = (MetaTable) getModelDAO().getById(sourceTableId, MetaTable.class);
destTable = (MetaTable) getModelDAO().getById(destTableId, MetaTable.class);
userMapping = getUserMapping(sourceTableId, destTableId);
sourceFields = new ArrayList<MetaField>();
destFields = new ArrayList<MetaField>();
for (FieldsMap f : userMapping) {
sourceFields.add((MetaField) getModelDAO().getById(f.getFieldIdSource(), MetaField.class));
destFields.add((MetaField) getModelDAO().getById(f.getFieldIdDest(), MetaField.class));
}
DataSourceConfig sourceDataSourceConfig = (DataSourceConfig) swapDataDAO.getById(sourceTable
.getDatasourceId(), DataSourceConfig.class);
swapDataDAO.inintConnection(sourceDataSourceConfig.getDriver(), sourceDataSourceConfig.getUrl(),
sourceDataSourceConfig.getUsername(), sourceDataSourceConfig.getPassword());
BatchPo batchPo = new BatchPo();
batchPo.setCount(swapDataDAO.getSwapDatasCount(sourceTable));
int count = batchPo.getCount() / batchPo.getSize() + 1;