getter和setter应该同步吗?

时间:2012-10-23 11:19:22

标签: java spring concurrency

我有2个使用spring @Transactional注释的方法。

@Transactional(readOnly = true) 
public ConfigParameter getConfigParameter(String key) { 

@Transactional(readOnly = false) 
public void setConfigParameter(ConfigParameter param) {

readOnly = false表示该方法将通过同步。 当setter上的 readyOnly = false 设置时,意味着对同步设置器的访问。

你是否同意在这种情况下,getter也应该将readOnly设置为true(同步)。因为否则我们将面临返回Object的不一致状态的风险。

当我用FindBugs检查这个类并得到警告时,我遇到了这个问题:

  

非同步get方法,同步集方法   这个类包含   类似命名的get和set方法,其中set方法是   synchronized和get方法不是。这可能导致错误   运行时的行为,因为get方法的调用者不一定   看到对象的一致状态。应该制作get方法   同步。

2 个答案:

答案 0 :(得分:1)

Spring @Transactional语义和同步完全是两个不同的东西 - 使用@Transactional(readOnly = false)注释setter不会使方法同步,就好像你要声明它一样:

public synchronized void setConfigParameter(ConfigParameter param)

read-only标志只是对底层持久性引擎的一个命中 - 事务管理器可以解释提示意味着当前事务是只读的 - 所以与线程的执行方式无关方法。

答案 1 :(得分:0)

我认为你没有正确地考虑这个问题。交易注释不属于这些方法。