【问题标题】:Synchronization getter and setter同步 getter 和 setter
【发布时间】:2017-08-18 19:29:30
【问题描述】:

我想向您寻求高级同步方面的帮助。 我有这样的课:

public class Manager{
    private ClassMatcher classMatcher;

    public ClassMatcher getClassMatcher(){
        return this.classMatcher;
    }
    public void setClassMatcher(ClassMatcher classMatcher){
        this.classMatcher = classMatcher;
    }
}

对象管理器可以被更多线程调用,所以方法:getClassMatchersetClassMatcher应该同步。 但在这种情况下,方法 getClassMatcher 只能由一个线程同时访问。

有什么办法可以解决吗?
好吧,也许我可以使用 LocksAtomicReferences

感谢您的任何建议,这将非常有帮助

【问题讨论】:

  • 为什么你认为setter需要同步,为什么你认为这样做会影响getter?
  • 这种高级同步如何?还有,解决什么?使方法同步是处理多个线程访问Manager 类的一种方法。
  • 如果没有清楚地描述如何使用它,实际上不可能提出正确的方法。您可能还想阅读stackoverflow.com/questions/11459543/…

标签: java methods synchronization atomic


【解决方案1】:

您不需要同步这些方法,但 ClassMatcher 类应该是线程安全的。

在您的情况下调用 get 或 set 不会导致问题,因为 set 方法只会替换类成员对新对象的引用。

【讨论】:

  • 为了安全发布,可能需要引用volatile
  • 同步(或其他措施)可能对于正确发布和通过设置器对其他线程的更改可见性是必要的。
【解决方案2】:

我看不出在此类示例中您需要同步的任何原因,因为您的访问器不会对共享状态做太多工作,这确实会导致一些并发问题。

例如,这里我们需要竞争条件和同步:

   public int get() {
      if (a == b) {
        return a;
      } else {
        return b;
      }
    }

PS:正如@shmosel 提到的,您可以将您的变量标记为volatile,以确保您获得()您的classMatcher 的最实际版本

【讨论】:

  • 同步(或其他措施)可能对于正确发布和通过设置器对其他线程的更改可见性是必要的。
  • 或者通过同步,或者通过原子更新器,或者......埃里希是我的观点;你的答案是不正确的,充其量是不完整的。
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多