java - 在重载方法上使用同步

标签 java multithreading

所以我正在编写一个方法,它接受一组参数并将它们写入日志文件。但是,传递给该方法的参数的类型和数量并不总是相同,这使我实现了该方法的重载版本。此外,该方法由并行运行的多个线程访问。我的问题是,在每个重载方法之前使用 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 实例上进行同步,就不会干扰该类的内部行为。

关于java - 在重载方法上使用同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47044163/

相关文章:

java - 网络中的对象编写

java - 如何避免在非最终字段上同步?

c++ - 无法使用 packaged_task 在 thread_group 中创建线程

java - 如何从启动器运行 Java Swing 游戏的动画线程?

Java:列出方法中使用的字段

java - 查找与 JUNG 距离为 2 的邻居

java - 对象传输完成后,AWS S3 TransferManager 不会退出

C++ 将对象传递给线程

java - 同步发生了一些奇怪的事情(Test2.class)

java - 围绕 superfirst 工作