`
liang100100
  • 浏览: 37183 次
  • 性别: Icon_minigender_2
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

不同线程调用同一个方法出现的问题

 
阅读更多
有一个DateUtil类,如下:
package com;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {
	private static final SimpleDateFormat yyyyMmDd = new SimpleDateFormat(
			"yyyy-MM-dd");
	public static String getBookInfoDate(int days) {
		Date now = new Date();
		return yyyyMmDd.format(new Date(now.getTime() - (long) days * 24L * 60L
				* 60L * 1000L));
	}

}


现在有两个线程都调用了该方法:
调用如下:
类1调用:debugLog.info("传参-2:"+DateUtil.getBookInfoDate(-2));
类2调用:debugLog.info("传参1:"+DateUtil.getBookInfoDate(1));
这两个类作为两个线程在同一时刻运行:
运行的结果如下:
2012-11-08|16:05:22.392|RMIScheduler_Worker-2|INFO |传参-2:2012-11-10|(FwcpTrailDueRemindJob.java:40)
2012-11-08|16:05:22.392|RMIScheduler_Worker-1|INFO |传参1:2012-11-10|(FwcpApplyRemindJob.java:40)


在同一时刻调用了同一个方法,虽然参数不一样,但是返回值是一样的。

如果吧DateUtil改为:
package com;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {
	public static String getBookInfoDate(int days) {
		Date now = new Date();
		SimpleDateFormat yyyyMmDd = new SimpleDateFormat("yyyy-MM-dd");
		return yyyyMmDd.format(new Date(now.getTime() - (long) days * 24L * 60L
				* 60L * 1000L));
	}

}

或者
package com;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {
	private static final SimpleDateFormat yyyyMmDd = new SimpleDateFormat(
			"yyyy-MM-dd");
	public static synchronized String getBookInfoDate(int days) {
		Date now = new Date();
		return yyyyMmDd.format(new Date(now.getTime() - (long) days * 24L * 60L
				* 60L * 1000L));
	}
}

把调用的方法改成上面两个运行出来的结果就正常了
2012-11-08|16:18:07.850|RMIScheduler_Worker-2|INFO |传参-2:2012-11-10|(FwcpTrailDueRemindJob.java:40)
2012-11-08|16:18:07.850|RMIScheduler_Worker-1|INFO |传参1:2012-11-07|(FwcpApplyRemindJob.java:40)


为什么第一种方法就会出现返回值一样?有没有人知道呀
分享到:
评论
2 楼 pch272215690 2012-12-17  
SimpleDateFormat不是线程安全的,把他写成一个常量大家都用,多线程下就出这问题了。
1 楼 pch272215690 2012-11-08  
package com;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {
private static final SimpleDateFormat yyyyMmDd = new SimpleDateFormat(
"yyyy-MM-dd");
public static synchronized String getBookInfoDate(int days) {
Date now = new Date();
return yyyyMmDd.format(new Date(now.getTime() - (long) days * 24L * 60L
* 60L * 1000L));
}
} 


这个格式好

相关推荐

    浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    C#跨线程调用窗体控件时可能会引发线程安全问题,例如当多个线程操作同一个控件时,该控件可能会进入不一致的状态,出现争用情况和死锁等问题。因此,确保以线程安全方式访问控件非常重要。 在C#中,控件并不是线程...

    C++11/14 线程调用类对象和线程传参的方法

    线程调用类对象 在前面的示例中,我们为线程任务使用了通常的函数。实际上,我们可以使用任何可调用对象或者lambda函数,如下调用类对象的例子: #include #include class MyFunctor { public: void operator()...

    线程及方法调用

    当创建一个Thread的子类并重写`run()`方法时,`run()`方法内部的代码定义了线程的行为。在`main`方法中创建子类实例并调用`start()`方法启动线程。例如: ```java public class MyThread extends Thread { @...

    易语言线程调用源码,易语言线程调用易包演示

    线程调用是编程中一个核心概念,特别是在并发编程中。在易语言中,创建和管理线程可以使得程序能够同时执行不同的操作,而不是按照顺序依次执行。这在需要处理大量数据或进行复杂计算时特别有用,因为线程可以并行...

    C#跨线程调用控件的四种方式(调用实例源码)

    下面我们将详细介绍C#中实现跨线程调用控件的四种常见方法,并提供相应的调用实例源码。 1. **控件的Invoke方法** 这是最常用且最直接的方法。`Control.Invoke`方法用于在控件所在的线程上执行指定的委托。如果...

    Java 线程同步调用

    线程同步是多线程编程中的一个关键概念,它确保了多个线程在访问共享资源时不会发生冲突,避免了数据不一致性和竞争条件等问题,从而保证了程序的稳定性和正确性。 ### Java线程同步调用详解 #### 同步方法调用 ...

    C#解决跨线程调用错误的简单方法

    在IT行业中,尤其是在开发多线程应用程序时,跨线程调用错误是一个常见的问题。C#作为.NET框架下的主要编程语言,提供了丰富的工具和技术来处理这种情况。本篇将深入探讨如何利用C#解决跨线程调用错误,以及相关的...

    Unity异步线程调用主线程脚本

    Unity异步线程调用主线程脚本程序,在Unity中异步线程调用主线程会报错,所以编写了一个Loom

    android java 多线程下载工具类调用一个方法即可

    这个“android java 多线程下载工具类”应该是为了简化这一过程而设计的,通过调用一个方法就能实现多线程下载功能。下面我们将深入探讨多线程下载的原理以及如何在Android中实现。 1. **多线程下载原理**: - 多...

    jni中用多线程调用java代码

    描述中提到的“在JNI中用多线程调用Java对象”,意味着在C/C++代码中创建并管理多个线程,每个线程负责调用不同的Java方法或者处理不同的Java对象。在Android中,线程管理对于优化应用性能和避免UI阻塞至关重要。...

    C# 跨线程调用控件

    为了解决这个问题,我们需要采用一种标准的跨线程调用控件的方法。 一、理解线程安全与UI线程 1. **线程安全**:线程安全是指在多线程环境下,一个类或方法能够正确地处理并发访问,不会导致数据混乱或异常。在...

    不同线程间的调用处理

    本篇文章将深入探讨如何利用线程池来实现不同线程间的异步调用,以及解决相关问题。 首先,我们需要理解线程的基本概念。线程是操作系统分配CPU时间的基本单位,一个进程中可以包含多个线程,它们共享同一内存空间...

    delphi多线程调用dll

    综上所述,Delphi多线程调用DLL涉及到了线程创建、DLL加载与卸载、函数调用、线程安全、同步原语使用等多个方面,需要开发者对多线程编程有深入的理解和实践经验。正确地处理这些问题将能充分利用多核处理器的优势,...

    跨线程调用控件示例

    在跨线程调用控件时,我们必须使用委托作为数据传递的载体,因为它们可以安全地在多个线程之间传递方法调用。委托本质上是类型安全的函数指针,允许我们传递方法作为参数或在事件处理中使用。 C#中,`Control....

    c#跨线程跨类调用窗体控件

    标题提到的“c#跨线程跨类调用窗体控件”是指在一个线程(非UI线程)中,通过另一个类来操作属于UI线程的窗体控件,比如`Form1`中的`ListBox1`。以下将详细阐述这个主题。 首先,理解C#中的线程概念是至关重要的。...

    3种多线程实现同步方法

    在互斥对象.cpp文件中,每个线程在访问共享资源前需要先调用lock()方法获取互斥锁,执行完相关操作后调用unlock()释放锁。这样,任何时刻只有一个线程能够持有互斥锁,从而避免了并发访问冲突。 除了以上三种方法,...

    多线程调用dll

    在编程领域,多线程是一种常见且重要的技术,它允许程序在同一时间执行多个独立的任务,从而提高系统的效率和响应性。特别是在处理I/O密集型或计算密集型任务时,多线程能充分发挥现代多核处理器的优势。本话题将...

    C#跨线程调用控件的四种方式

    为了解决这个问题,开发者需要使用特定的方法来跨线程安全地调用控件。以下就是C#中非控件创建线程调用控件的四种主要方式: 1. **Control.Invoke() 和 Control.BeginInvoke()** 这是最常见的处理跨线程操作的方法...

    c#跨线程间控件调用

    除了 `InvokeRequired` 属性之外,`Invoke` 方法也是解决跨线程调用控件的关键之一。该方法允许从非创建控件的线程安全地调用该控件的方法。通常情况下,会结合 `Delegate`(委托)使用 `Invoke` 方法,以确保代码的...

    线程间的调用

    在编程领域,线程间的调用是多线程编程中的一个重要概念。线程是操作系统分配处理器时间的基本单元,它使得程序能够同时执行多个任务。在本文中,我们将深入探讨线程的创建、通信、同步以及如何使用特定的线程操作如...

Global site tag (gtag.js) - Google Analytics