0 0

增强循环下使用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个答案 按时间排序 按投票排序

1 0

for(final Object obj : list) {
}

反编译的结果是:

Object localObject;
for (Iterator localIterator = list.iterator(); localIterator.hasNext(); localObject = localIterator.next());

2012年10月08日 15:14
0 0

问题不够详细,什么是多开了几个线程,什么地方开了多线程。出现了什么问题。你的那二段代码没有任何区别啊。

2012年10月10日 14:43
0 0

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
0 0

这个问题关注一下!

2012年10月08日 18:22
0 0

final 定义的对象应该会放在常量池中,每次取得应该都是一个。虽然final引用是不能更改的,但是final变量引用的对象本身内容是可以改变的,所以在多线程情况下就会出现上面的情况,
PS:自己理解而已

2012年10月08日 15:44
0 0

能看看你处理a的里面的代码吗??最好是把改正前和改正后的数据贴出来看一下

2012年10月08日 14:17

相关推荐

    Android代码-安卓多线程下载

    安卓多线程下载 使用方法如下: //0. listView = (ListView)findViewById(R.id.listView1); final TestAdapter testAdapter = new TestAdapter(); //1.获取DownloadManager实例 建议在application中初始化 ...

    final_crawler_爬虫_多线程_

    一系列单线程和多线程爬虫程序,同时能够规定爬取的数量,可以将爬取的网站内容和网站html文件分别保存。

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    final关键字的使用

    final的使用简单简绍,更容易的理解final关键字的使用

    java多线程关键字final和static详解

    主要介绍了java多线程关键字final和static详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java 多线程与并发(6-26)-关键字- final详解.pdf

    Java 多线程与并发(6_26)-关键字_ final详解

    Final_Cut_Pro使用手册.pdf

    Final_Cut_Pro使用手册.pdf

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

    final关键字的使用.mp4

    final关键字的使用f

    Java多线程和并发知识整理

    1.1为什么需要多线程 1.2不安全示例 1.3并发问题的根源 1.4JMM 1.5线程安全的分类 1.6线程安全的方法 二、线程基础 2.1状态 2.2使用方式 2.3基础机制 2.4中断 2.5互斥同步 2.6线程合作 三、...

    Unity Final IK Unity IK最新2.0版本 支持Unity2020以下的版本

    Final IK是Unity的逆向运动学解决方案的插件。 Final IK包含: 用于Biped骨骼角色的全身IK系统 Biped IK :Unity的内置Avatar IK系统的替代品,提供更大的灵活性,并使用相同的API CCD IK: 循环坐标下降IK Multi-...

    配置hibernate-distribution-3.6.6.Final时出现的问题及解决办法

    配置hibernate-distribution-3.6.6.Final时出现的问题及解决办法

    数据恢复硬盘恢复FinalData-v2.0企业版破解版带注册机

    FinalData 使用这一项原则复原数据, 甚至那之后使再循环箱柜已经被倒空。 除此之外, FinalData 容易地能够复原划除文件和被病毒损害的硬盘数据或被意外的 格式。 甚至在极端的情况, 在目录结构被部份地损害的地方, ...

    android 多线程多任务断点下载

    //对于UI控件的更新只能由主线程(UI线程)负责,如果在非UI线程更新UI控件,更新的结果不会反映在屏幕上,某些控件还会出错 private void download(final String path, final File dir){ new Thread(new Runnable...

    WinAVIVideoConverter8.0Final汉化增强版.rar

    WinAVIVideoConverter8.0Final汉化增强版.rarWinAVIVideoConverter8.0Final汉化增强版.rarWinAVIVideoConverter8.0Final汉化增强版.rarWinAVIVideoConverter8.0Final汉化增强版.rarWinAVIVideoConverter8.0Final汉化...

    黄骅二期循环泵技术协议final.doc

    黄骅二期循环泵技术协议final.doc

    Final IK v2.1

    Unity 的最终逆向运动学解决方案。 更新 (1.9): 1.9 版本对最终逆向运动学 (Final IK) 进行了很多修复和改进: - 增加了烘焙器,这是一个...CCDIKJ、AimIKJ - 基于 AnimationJobs 的多线程求解器 + 62 个演示场景

    Final IK 1.9 Final IK 1.9

    Final IK 1.9

    Unity3D Final-IK-v2.3

    Final IK是一个强大的高速轻量级全身IK求解器,用于实时程序动画修改和各种复杂的动画效果。本文将简单描述一种常用FinalIK组件的基本使用方法。 1Ground IK 首先向场景中放置一个角色。 给它添加四个组件,分别...

    Android使用AsyncTask实现多线程下载的方法

    本文实例讲述了Android使用AsyncTask实现多线程下载的方法。分享给大家供大家参考,具体如下: public class MainActivity extends Activity implements OnClickListener { private Button btn1, btn2, btn3; ...

Global site tag (gtag.js) - Google Analytics