作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在一家知名公司的面试中,我遇到了这样的问题:
你有一个类,你的同事忘了同步一些重要的方法如何在不更改同一类的情况下使其线程安全?
public class Account{
//some variables
public boolean withdraw()
{
//some business logic
return true;
}
public boolean deposite()
{
//some business logic
return false;
}
}
我不确定答案是什么,也可能是愚蠢的答案。请帮助我得到答案。
我的回答:我给出了答案,就像我们可以对其进行包装并且我们可以同步。这不是令人信服的答案,我认为这是获得答案的最佳平台
最佳答案
我在这里看到两个可能的答案:
public class SyncrhonizedAccess extends Account {
public synchronized boolean withdraw() {
return super.withdraw();
}
public synchronized boolean deposite() {
return super.deposite();
}
}
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
类具有共享状态 - 数据字段实际上被 withdraw
和 deposite
更改和访问,那么这一切都是有意义的> 方法。否则你真的不需要同步任何东西。
关于java - 如何使方法线程安全,即使我忘记在不更改文件的情况下在方法或 block 级别添加同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59948283/
我是一名优秀的程序员,十分优秀!