我有一个调度程序每分钟调用一次从ftp获取文件的方法,处理并将其记录保存到数据库。我需要使这个线程安全,以便如果该方法必须一次执行多个文件,它将以线程安全的方式运行..
public synchronized void processData(String data){
//do processing
}
这真的是一个线程安全的方法,可以优雅地处理大量的负载吗?
答案 0 :(得分:3)
只要它不使用封闭对象中的任何有状态字段,它就是线程安全的。
换句话说,如果有一个类级别字段在processData(String data)
中被操作或访问,目的是跟踪正在发生的事情,那么它就不是线程安全的。
示例可能是名为private Boolean hasConnection;
的类级别字段如果您需要检查此字段是否存在连接,那么您没有线程安全方法。
如果您符合此要求,则甚至无需在方法中添加synchronized
关键字。默认情况下,它是线程安全的,并且无限数量的线程可以同时访问它。
如果您不满足此要求,则需要发布整个班级以确定它是否是线程安全的。
答案 1 :(得分:2)
假设神秘的“处理文件”操作是自包含的,你应该担心的最重要的事情是你的数据库连接:不要让它共享,每次从连接字符串获取一个新的,并使用connection pool。除非您需要访问类中的共享状态,否则不要使方法同步;否则,您的方法将无法在多个线程上同时进行。
答案 2 :(得分:1)
请描述您的方法使用哪些资源,以及共享哪些资源。
如果您不使用普通对象,则没有问题。
如果您确实使用公共资源,则需要确保可以以线程安全的方式访问这些资源,或者多个线程不能访问这些资源。
你的问题是关于表现。通常,processData
似乎是一种需要一些时间才能完成的方法:您正在使用数据库。与数据库查询相比,获取锁定所需的时间最短。不,synchronized
关键字不会给您带来明显的性能影响。