【问题标题】:Synchronized method Java同步方法 Java
【发布时间】:2016-03-18 07:34:28
【问题描述】:

我有一个关于线程间同步的问题。

确实,我有一个只读取静态变量的方法。一些线程访问这个变量但没有写入,只有读取。

我必须声明方法 Synchronized 吗?

【问题讨论】:

  • 没有。将读取操作声明为同步是没有意义的
  • 这是一个常数吗?它是如何初始化的?

标签: java multithreading concurrency synchronization


【解决方案1】:

您不需要使您的方法synchronized,但如果您使用来自多个线程的某个变量(静态或非静态),则应该有一个同步机制。

  • 如果您只初始化一次变量,则只需确保 safe publication 即可。

    • 如果初始化可能很激烈,您应该使用经过充分验证的惯用语,例如 Double-Checked Locking(正确编写)或 Initialization On Demand。
  • 如果预计会偶尔写入变量,则应消除数据争用的机会。您应该确保写入的原子性以及这些写入对读者的可见性。

    • 执行此操作的一种常见方法是通过synchronized 方法编写,将变量设为volatile,如果变量是复杂对象,请确保其字段的安全发布。

【讨论】:

  • 如果线程 A 从 synchronized(o) 块中更新了某个变量 v,这不足以与其他线程建立“发生在之前”的关系B 读取v。建立happens-before的最常规方法是让线程B仅从另一个synchronized(o)块中读取v
  • @jameslarge 你是对的,但我不确定你的观点是否与我的回答有任何关系。写入synchronized 块并读取volatile 字段是一种有效的同步机制,适用于相当数量的以读取为主的用例。在此处查看 Brian Goetz 所说的“廉价读写锁”:ibm.com/developerworks/library/j-jtp06197
  • 糟糕!我没有读整句话:“一种常见的方法是通过同步方法编写,使变量易失,然后......”对不起。
  • 不必要地使用“volatile”是不好的做法,因为“volatile”很昂贵
  • @penguin 这是一个基本正确的陈述,但它并没有真正澄清、更正或与上面的答案或我对@jameslarge 的回复有关,这可能会让读者感到困惑,因为我没有t 建议在不需要的地方使用volatile
【解决方案2】:

同步是在以读写模式访问资源时将线程排序在一起的问题。

如果值没有被修改,那么将评估者标记到这个变量是没有用的

尽管如此,如果变量是对象,返回 bee 属性的内部表示可能会造成破坏,因为您返回了对该对象的引用。

因此,即使是读取,也不会阻止代码稍后更改值..

这就是为什么一些错误跟踪工具会在您返回可变对象的内部引用时向您发出警告。

有些本质上是不可变的,例如字符串、整数 .... 和所有原语(总是按值传递)。

如果该变量是可变类型,您可以做的就是在返回变量之前复制该变量。

例如需要返回myDate字段的值:

private Date myDate;

public Date getMyDate(){
  // returning a copy of the myDate variable
  return (this.mydate==null)?null:new Date(this.mydate.getTime());
}

【讨论】:

    【解决方案3】:

    当没有为变量设置新值时,不同步它们应该没问题。

    【讨论】:

      【解决方案4】:

      答案是肯定的。没有必要,而且会浪费时间。

      【讨论】:

        【解决方案5】:

        没有写作,只有阅读。

        那么synchronization不需要了。

        但是,您应该考虑将静态变量 final 设置为您已经说过的仅用于阅读目的。此步骤将保证将来免受任何可能的并发危害。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-10
          • 2011-09-21
          • 2011-11-08
          相关资源
          最近更新 更多