在重载方法上使用synchronized

时间:2017-10-31 20:37:15

标签: java multithreading

所以我正在编写一个方法,它接受一组参数并将它们写入日志文件。但是,传递给方法的参数的类型和数量并不总是相同的,这使我实现了方法的重载版本。此外,此方法由并行运行的多个线程访问。我的问题是,在每个重载方法之前使用synchronized是否控制对整个方法的访问权限或仅控制方法的每个重载版本?如果是后者,是否有其他方法可以控制对日志文件的访问?

1 个答案:

答案 0 :(得分:2)

如果所有方法都是synchronized(并且您使用相同的实例来调用它们),那么您将在每个方法之间进行互斥。 (假设你的方法不是静态的。如果你的方法都是静态的,那么同样适用于你自己同步的类。如果你使用静态和非静态方法的混合,那么......不要那样做。)

但是,对公共可访问对象(您的日志记录对象必须是)进行同步并不是一个特别好的主意。你最好做这样的事情:

public class Logger {
    private final Object LOCK = new Object();

    public void log(String s) {
        synchronized (LOCK) {
           //write to log
        }
    }

    public void log(int i) {
        synchronized (LOCK) {
           //write to log
        }
    }
 }

这样,如果外部人选择在Logger实例上进行同步,则不会干扰类的内部行为。