如何使方法线程安全,即使我忘记在方法或块级别添加同步而不更改文件?

问题描述 投票:3回答:2

虽然在一家知名公司的采访中,我遇到了类似的问题:

您只有一堂课,而您的同事却忘记了同步一些重要的方法如何在不更改同一类的情况下使其线程安全?

public class Account{

    //some variables

    public boolean withdraw()
    {
        //some business logic
        return true;
    }

    public boolean deposite()
    {
        //some business logic
        return false;
    }
}

我不确定答案是什么,也可能是愚蠢的答案。请帮助我获得答案。

我的答案:我给出了答案,就像我们可以对其进行包装并且可以进行同步。这并不令人信服,我认为这是获得答案的最佳平台

java multithreading synchronized
2个回答
4
投票

我在这里看到两个可能的答案:

  1. 扩展Acount类并同步方法访问:
public class SyncrhonizedAccess extends Account {
   public synchronized boolean withdraw() {
     return super.withdraw();
   }

   public synchronized boolean deposite() {
      return super.deposite();
   }
}
  1. 包装类并同步对包装对象的访问:
public class AccountWrapper {
    private final Account realAcount;

    public AccountWrapper(Account realAccount) {
       this.realAccount = realAccount;
    }

    public synchronized boolean withdraw()
    {
       return realAccount.withdraw();
    }

    public synchronized boolean deposite()
    {
        return realAccount.deposite();
    }
}

现在,这两种方法都可以通过多种方式(手动方式,如我所示)完成,并自动生成(归结为刚才提到的一种方法,该方法只是由CGLIB(字节代码生成库)之类的库“自动”完成的) ,甚至使用AOP(面向方面​​的编程)。

另一面说明是,可以在方法内部内部创建锁并对其进行同步,而不是使用单词synchronized。>

当然,如果Account类具有共享状态,这一切都是有意义的-实际由withdrawdeposite方法更改和访问的数据字段。否则,您实际上就不必进行任何同步。


0
投票

我肯定会使用一个方面,并使对方法的调用同步。鉴于自从我的应用程序或第三方库的其他点以来,正在调用方法,所以我会选择此选项

© www.soinside.com 2019 - 2024. All rights reserved.