0

我试图了解在 java 中使用同步关键字的锁是如何工作的。如果我有课(忘记公共变量等的不良做法等)

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)创建一个锁块,这会阻止其他线程操纵财产钱吗?或者我是否需要将货币属性设为私有并使用 synchronize 修饰符定义 getter / setter 以确保该值不会冒着陷入竞争条件的风险?

4

3 回答 3

2

您提供的代码只会阻止其他线程money通过方法修改变量,give_bonus()直到方法返回(或者更确切地说,就在方法返回之前)。

正如您所猜测的那样,您必须创建变量private并将同步添加到 setter 方法以确保安全。只要确保你在同一个锁上同步。

于 2013-05-26T19:10:19.477 回答
1

同步this与对象的内容完全无关this。Java 的锁定机制基本上依赖于常规对象,这些对象扮演着与它们的“对象性”完全不同的另一个角色。这个另一个角色涉及每个对象中的一个特殊字段,称为它的监视器,记录哪个线程获取了它以及获取了多少次。

于 2013-05-26T19:26:28.497 回答
0

你可以把它想象成每个对象实例都拥有一张“票”(称为它的监视器)。当线程想要进入synchronized特定对象上的块时,线程必须首先从对象“获取票”,然后在退出块或调用wait()它时交回票。

如果票当前不可用(因为另一个线程在同一个或另一个需要相同票的同步块中),那么它必须等待。

在您的示例中,没有什么可以阻止线程 2money直接访问 - 线程 1 位于同步块中的事实只会阻止线程 2 同时进入同一监视器上的同步块。

于 2013-05-26T19:20:51.553 回答