我试图了解 Java 中使用同步关键字的锁是如何工作的。 如果我有一个类(忘记公共(public)变量等的不良做法等)
class Person
{
public int money;
public String name;
public void give_bonus()
{
synchronize(this)
{
money += 10;
name = "....";
}
}
}
// thread one
person.give_bonus();
// thread two
person.money += 50;
现在我的问题是,如果我使用实例锁(this)创建一个锁 block ,这会阻止其他线程操纵属性(property)资金吗?或者我是否需要将钱属性设为私有(private)并使用同步修饰符定义 getter/setter 以确保该值不会面临竞争条件的风险?
最佳答案
您提供的代码只会阻止其他线程通过 give_bonus()
方法修改 money
变量,直到该方法返回(或者更确切地说,在该方法返回之前) )。
正如您所猜测的,您必须将变量设置为私有(private),并将同步添加到 setter 方法中才能安全。只需确保您在同一个锁上进行同步即可。
关于Java同步修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16762747/