制定预定方法线程安全

时间:2012-04-10 03:14:57

标签: java multithreading performance thread-safety synchronized

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

如果您符合此要求,则甚至无需在方法中添加synchronized关键字。默认情况下,它是线程安全的,并且无限数量的线程可以同时访问它。

如果您不满足此要求,则需要发布整个班级以确定它是否是线程安全的。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

请描述您的方法使用哪些资源,以及共享哪些资源。

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

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

你的问题是关于表现。通常,processData似乎是一种需要一些时间才能完成的方法:您正在使用数据库。与数据库查询相比,获取锁定所需的时间最短。不,synchronized关键字不会给您带来明显的性能影响。