2017-08-18 37 views
-1

我想问你高级同步的帮助。 我上课是这样的:同步获取器和设置器

public class Manager{ 
    private ClassMatcher classMatcher; 

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

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

有什么方法可以解决它?
也许我可以使用原子参考

谢谢你的任何建议,这将是真正有用的

+0

为什么你认为制定者需要同步,你为什么认为这样做会影响吸气者? – shmosel

+0

这种高级同步是如何进行的?另外,解决什么?使这些方法同步是处理访问'Manager'类的多个线程的一种方式。 – Kayaman

+0

如果不清楚如何使用它,建议一个正确的方法是不可能的。您可能还想阅读https://stackoverflow.com/questions/11459543/java-synchronized-getters-and-setters?rq=1 –

回答

-1

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

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

+0

可能有必要为安全发布制作引用“volatile”。 – shmosel

+0

同步(或其他措施)可能需要正确发布和更改透过setter到其他线程的可见性。 –

-1

我看不出有什么理由需要在这样的例子中进行同步,因为您的访问器不会在共享状态下做很多工作,这会导致一些并发问题。

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

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

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

+0

同步(或其他措施)可能需要正确发布和通过setter到其他线程的变化的可见性。 –

+0

更改的可见性是通过'volatile'修饰符实现的...... – vk23

+0

或者通过同步,或者通过原子更新器,或... Erich是我的观点;你的答案最好是不正确和不完整的。 –