0

我有一个方法,调度程序每分钟调用一次以从 ftp 获取文件,处理并将其记录保存到数据库中。我需要使这个线程安全,以便如果该方法必须一次执行多个文件,它以线程安全的方式运行..

public synchronized void processData(String data){
   //do processing
} 

这真的会是一种线程安全的方法,可以优雅地处理大量负载吗?

4

3 回答 3

3

只要它不使用封闭对象中的任何有状态字段,它就是线程安全的。

换句话说,如果有一个类级别的字段被操作或访问以processData(String data)跟踪正在发生的事情,那么它就不是线程安全的。

一个例子可能是一个类级别的字段,private Boolean hasConnection; 如果您需要检查是否存在与该字段的连接,那么您没有线程安全的方法。

如果您满足此要求,那么您甚至不必将synchronized关键字添加到您的方法中。默认情况下,它将是线程安全的,并且无限数量的线程可以同时访问它。

如果你不满足这个要求,那么你将需要发布整个类以确定它是否是线程安全的。

于 2012-04-10T03:16:28.143 回答
2

假设神秘的“处理文件”操作是自包含的,那么您最应该担心的是您的数据库连接:不要使其共享,每次从连接字符串中获取一个新的,并使用连接池。不要让你的方法同步,除非你需要访问你的类中的共享状态;否则,您的方法将无法在多个线程上同时取得进展。

于 2012-04-10T03:23:43.823 回答
1

请向我们描述您的方法使用了哪些资源,以及哪些资源是共享的。

如果不使用普通对象,则没有问题。

如果您确实使用公共资源,则需要确保这些资源可以以线程安全的方式访问,或者不被多个线程访问。

你的问题是关于性能的。一般来说,processData这似乎是一种需要一些时间才能完成的方法:您正在使用数据库。与数据库查询相比,获得锁所需的时间最少。所以不,synchronized关键字不会给您带来任何明显的性能影响。

于 2012-04-10T13:20:19.983 回答