在重载方法上使用synchronized

g9icjywg  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(337)

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

siv3szwd

siv3szwd1#

如果所有的方法都是 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 例如,这不会干扰类的内部行为。

相关问题