gpt4 book ai didi

java - 如何使方法线程安全,即使我忘记在不更改文件的情况下在方法或 block 级别添加同步?

转载 作者:行者123 更新时间:2023-12-03 23:23:49 25 4
gpt4 key购买 nike

在一家知名公司的面试中,我遇到了这样的问题:

你有一个类,你的同事忘了同步一些重要的方法如何在不更改同一类的情况下使其线程安全?

public class Account{

//some variables

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

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

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

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

最佳答案

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

  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 更改和访问,那么这一切都是有意义的> 方法。否则你真的不需要同步任何东西。

关于java - 如何使方法线程安全,即使我忘记在不更改文件的情况下在方法或 block 级别添加同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59948283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com