【问题标题】:Should this be a synchronized method?这应该是同步方法吗?
【发布时间】:2011-03-26 11:44:49
【问题描述】:

我正在使用 TestNG 并行运行测试,并希望小心帮助程序类和实用程序可能出现的同步问题。据我所知,每个测试都是它自己的对象,由测试运行者透明地创建。因此,我不需要担心同步任何非静态对象,因为它是在线程中创建的对象,因此对其他对象不可见。

但是,当我调用我编写的这个外部日志函数时,它是否需要同步?是否存在可能的竞争条件,其中线程 1 进入并设置 threadName="Thread-1",然后线程 2 进入并设置 SAME threadName 变量 = "Thread-2",然后线程 1 重新启动并打印出来“--foo | 线程 2”?我需要将其设为同步方法吗?

public static void log(String _message) {
  String threadName = Thread.currentThread().getName();
  log.println("--" + _message + " | Thread: " + threadName);
}

【问题讨论】:

    标签: java multithreading synchronization parallel-processing testng


    【解决方案1】:

    您的变量 threadName 是一个局部变量每个线程都有一个实例,更准确地说,每个函数调用都会存在一个实例。这意味着它们不会相互影响。

    【讨论】:

    • 太棒了!这就是我的想法,感谢闪电(字面意思是 10 秒或更短)的快速响应!我不需要担心同步非静态方法的假设是否正确?其实我唯一需要担心的就是静态成员变量?
    • 由于非静态方法也可以访问共享数据,我建议始终使用监视器。监视器是一个被动类,其唯一目的是保存变量。监视器必须满足的一项重要属性是线程安全的。我只使用信号量在 Java 中完成此任务,但我猜同步方法的工作方式相同。 :)
    • 在这种情况下,可以有哪些非静态共享数据?
    • 我已将其定义为 private static final PrintStream log = System.out;是否担心日志的内部工作可能无法同时处理多个线程访问它?它应该是易变的而不是最终的吗?
    【解决方案2】:

    强调 Marcus 上面所说的:这个日志字段是什么?确保它是线程安全的,否则您会看到混淆的日志消息。

    【讨论】:

      猜你喜欢
      • 2012-12-16
      • 1970-01-01
      • 2016-03-09
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      相关资源
      最近更新 更多