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

相关推荐

    数据结构课程设计单循环赛中选手胜负序列求解问题

    在这个特定的课程设计中,我们关注的是“单循环赛中选手胜负序列求解问题”。这是一个典型的图论问题,与实际的体育赛事排名规则紧密相关,比如篮球比赛或围棋比赛的积分制。 首先,我们要理解单循环赛的规则。在单...

    java多线程进度条

    本主题将深入探讨如何在Java多线程环境下实现进度条功能。 首先,理解Java多线程的基本概念至关重要。Java通过Thread类和Runnable接口来支持多线程。创建一个新线程通常有两种方式:继承Thread类并重写run()方法,...

    Java多线程同步.pdf

    因此,在使用Java多线程同步机制时,需要小心避免这些问题的出现。 Java多线程同步机制在实际应用中的应用 Java多线程同步机制在实际应用中有很多应用,例如: * 在线银行系统中,使用Java多线程同步机制来确保...

    java多线程设计

    3. 线程同步:Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(ReentrantLock等)、Semaphore信号量、CyclicBarrier屏障等,用于解决多线程环境下资源竞争和数据一致性问题。 二、不可变...

    linux下C语言多线程编程实例

    在Linux环境下进行C语言多线程编程,可以利用POSIX线程库...以上代码展示了如何在Linux下使用C语言进行多线程编程,包括创建线程、同步与通信。理解这些基本概念和实例,有助于开发者灵活地利用多线程来优化程序性能。

    多线程读取文件

    在实际应用中,还需要注意线程安全问题,例如避免多个线程同时修改同一数据结构。此外,合理设置线程数量和块大小对性能有很大影响,需要根据硬件资源和文件大小进行调整。最后,确保正确关闭线程池,防止资源泄漏。...

    多线程学习汇总资料,多线程学习汇总资料,

    9. **线程安全**:线程安全的代码意味着在多线程环境下,它能正确地工作,不会因为线程间的交互而导致数据不一致。无锁编程、原子操作、CAS(Compare and Swap)等技术有助于实现线程安全。 10. **线程通信**:线程...

    多线程程序例子 C++多线程 源代码 有很大的参考价值

    下面我们将深入探讨这个主题,了解如何使用C++进行多线程编程。 首先,创建一个新的线程非常简单。你可以创建一个函数,然后将这个函数作为参数传递给`std::thread`的构造函数。例如: ```cpp #include #include ...

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

    本文将详细解释Java多线程与并发中关键字final的使用和实现原理,并讨论final的限制条件和局限性。 一、final关键字的基本使用 final关键字是Java语言中的一个关键字,用于修饰类、方法、变量等。final关键字的...

    final_crawler_爬虫_多线程_

    - 使用多线程需要注意线程安全问题,如共享资源(如URL队列)时应避免竞态条件,可使用锁(Lock)等机制来确保同步。 4. **线程池(ThreadPoolExecutor)**: - 在Python中,除了直接使用`threading`模块,还可以...

    C++多线程例子

    在C++编程中,多线程是一个核心概念,...然而,要注意的是,多线程也带来了复杂性,包括死锁、竞态条件等问题,需要谨慎设计和测试来避免。在实际应用中,应结合具体需求选择合适的并发模型,例如线程池、异步操作等。

    C++11多线程demo

    C++11是C++语言的一个重要版本更新,它引入了大量的新特性,其中多线程支持是其中之一。这个"C++11多线程demo"旨在帮助...同时,注意线程安全问题,合理利用互斥量等同步机制,是编写高效且可靠的多线程程序的关键。

    内存模型-多线程内存模型

    一个良好的内存模型能够帮助程序员避免常见的多线程问题,如竞态条件(race conditions)、死锁(deadlocks)等,并确保多线程程序的执行结果具有可预测性。 #### 三、C++09内存模型的动机 C++09内存模型的引入主要是...

    线程问题出现与解决

    ### 线程问题出现与解决 #### 一、实现多线程 多线程是现代编程语言中处理并发操作的重要机制之一。在Java中,可以通过两种主要方式实现多线程:继承`Thread`类或者实现`Runnable`接口。 ##### 1.1 继承Thread类 ...

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

    Java多线程关键字final和static详解 Java多线程编程中,final和static关键字扮演着非常重要的角色,它们可以帮助开发者编写更加安全、可靠的多线程程序。在本文中,我们将深入探讨final和static关键字在Java多线程...

    详细剖析JAVA多线程案例教学

    生产者消费者模式是一种经典的多线程编程模型,用于解决多线程之间的数据传递问题。在这个模式中,生产者负责生成数据,消费者负责消费数据。Java中可以通过队列、锁等工具来实现这一模式。 - **示例代码**: ```...

    Java多线程同步机制在售票系统的实现

    Java的多线程同步机制为解决多线程环境下的数据一致性问题提供了有效的解决方案。在实际开发中,合理地运用这些机制能够显著提升程序的稳定性和安全性。尤其是在像售票系统这样的应用场景中,正确地使用同步机制可以...

    Java 多线程 订票 示例 线程安全

    然而,多线程环境下的数据共享和操作可能会引发线程安全问题,如果不正确处理,可能导致数据不一致、程序崩溃等严重后果。本示例将探讨如何在Java中实现一个线程安全的订票系统。 首先,我们要理解什么是线程安全。...

    java多线程死锁预防机制研究

    本文旨在探讨Java多线程环境下的死锁问题,并提出有效的预防机制。 #### 1. 引言 在多线程环境中,多个线程共享系统资源(如内存、文件、CPU时间等)。当多个线程尝试获取相同的资源时,如果没有适当的控制机制,就...

    JAVA网络编程及多线程

    ### JAVA网络编程及多线程 #### 一、多线程基本概念 多线程是现代编程语言中的一项重要技术,特别是在Java这样的面向对象语言中,多线程能够极大提高程序的性能和响应速度。线程是操作系统能够进行运算调度的最小...

Global site tag (gtag.js) - Google Analytics