-
增强循环下使用final, 出现多线程问题。求解哈。。。10
遇到一个奇特的问题。。。用增强循环。
for(final 对象 a:引用集合){}不会报错。
但是在多线程环境下。
for(final 对象 a:引用集合){
task.add(new Callable<Void>(){
public Void call() throws Exception {
处理 a;
}
});
}
线程池开2,3个没看到问题,
开到10结果数据错乱。。。原因查了好久未知。
解决方法是:
for(对象 a:引用集合){
final 对象 a1 = a;
task.add(new Callable<Void>(){
public Void call() throws Exception {
处理 a1;
}
});
}
那个引用集合,没有做删除,修改操作。不知道啥原因。。估计是final 闹的。就是自己没有个合理解释,不安心(=@__@=)。2012年10月08日 11:45
6个答案 按时间排序 按投票排序
-
for(final Object obj : list) {
}
反编译的结果是:
Object localObject;
for (Iterator localIterator = list.iterator(); localIterator.hasNext(); localObject = localIterator.next());2012年10月08日 15:14
-
for(final 对象 a:引用集合){
task.add(new Callable<Void>(){
public Void call() throws Exception {
处理 a;
}
});
}
1、final化局部变量的目的是因为内部类要使用,即new Callable(){}会生成一个匿名内部类 如
class Callable$1 {
final 对象 val$o;
Callable$1(对象 a) {//拷贝一份局部变量
this.val$o=a;
}
}
即内部类会把final的局部变量 拷贝一份 传到内部类中。 和下边的是一样的功能:
解决方法是: //此处怀疑还是不行,多执行几遍试试,如果可以的话 还是贴下测试代码 这么几段不好推敲原因
for(对象 a:引用集合){
final 对象 a1 = a;
task.add(new Callable<Void>(){
public Void call() throws Exception {
处理 a1;
}
});
}
而且局部变量没有线程安全的问题,所以【1】 和 【2】 其实一样。
线程池开2,3个没看到问题,
开到10结果数据错乱。。。原因查了好久未知。 怎么个错乱法, 能否细细描述下。或者上相关代码。
2012年10月08日 22:42
-
final 定义的对象应该会放在常量池中,每次取得应该都是一个。虽然final引用是不能更改的,但是final变量引用的对象本身内容是可以改变的,所以在多线程情况下就会出现上面的情况,
PS:自己理解而已2012年10月08日 15:44
相关推荐
安卓多线程下载 使用方法如下: //0. listView = (ListView)findViewById(R.id.listView1); final TestAdapter testAdapter = new TestAdapter(); //1.获取DownloadManager实例 建议在application中初始化 ...
一系列单线程和多线程爬虫程序,同时能够规定爬取的数量,可以将爬取的网站内容和网站html文件分别保存。
java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...
final的使用简单简绍,更容易的理解final关键字的使用
主要介绍了java多线程关键字final和static详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java 多线程与并发(6_26)-关键字_ final详解
Final_Cut_Pro使用手册.pdf
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...
final关键字的使用f
1.1为什么需要多线程 1.2不安全示例 1.3并发问题的根源 1.4JMM 1.5线程安全的分类 1.6线程安全的方法 二、线程基础 2.1状态 2.2使用方式 2.3基础机制 2.4中断 2.5互斥同步 2.6线程合作 三、...
Final IK是Unity的逆向运动学解决方案的插件。 Final IK包含: 用于Biped骨骼角色的全身IK系统 Biped IK :Unity的内置Avatar IK系统的替代品,提供更大的灵活性,并使用相同的API CCD IK: 循环坐标下降IK Multi-...
配置hibernate-distribution-3.6.6.Final时出现的问题及解决办法
FinalData 使用这一项原则复原数据, 甚至那之后使再循环箱柜已经被倒空。 除此之外, FinalData 容易地能够复原划除文件和被病毒损害的硬盘数据或被意外的 格式。 甚至在极端的情况, 在目录结构被部份地损害的地方, ...
//对于UI控件的更新只能由主线程(UI线程)负责,如果在非UI线程更新UI控件,更新的结果不会反映在屏幕上,某些控件还会出错 private void download(final String path, final File dir){ new Thread(new Runnable...
WinAVIVideoConverter8.0Final汉化增强版.rarWinAVIVideoConverter8.0Final汉化增强版.rarWinAVIVideoConverter8.0Final汉化增强版.rarWinAVIVideoConverter8.0Final汉化增强版.rarWinAVIVideoConverter8.0Final汉化...
黄骅二期循环泵技术协议final.doc
Unity 的最终逆向运动学解决方案。 更新 (1.9): 1.9 版本对最终逆向运动学 (Final IK) 进行了很多修复和改进: - 增加了烘焙器,这是一个...CCDIKJ、AimIKJ - 基于 AnimationJobs 的多线程求解器 + 62 个演示场景
Final IK 1.9
Final IK是一个强大的高速轻量级全身IK求解器,用于实时程序动画修改和各种复杂的动画效果。本文将简单描述一种常用FinalIK组件的基本使用方法。 1Ground IK 首先向场景中放置一个角色。 给它添加四个组件,分别...
本文实例讲述了Android使用AsyncTask实现多线程下载的方法。分享给大家供大家参考,具体如下: public class MainActivity extends Activity implements OnClickListener { private Button btn1, btn2, btn3; ...