Java同步修改器

Java同步修改器,java,locking,Java,Locking,我试图理解在java中使用同步关键字的锁是如何工作的。 如果我有一门课(忘了公共VAR的坏习惯等) 现在我的问题是,如果我使用实例锁创建一个锁块(this),这会阻止其他线程操纵属性money吗?或者我是否需要将money属性设置为私有,并使用synchronize修饰符定义getter/setter,以确保该值不存在运行到竞争条件的风险?您提供的代码只会阻止其他线程通过give_bonus()修改money变量method,直到该方法返回(或者更确切地说,就在该方法返回之前) 正如您所猜测的,

我试图理解在java中使用同步关键字的锁是如何工作的。 如果我有一门课(忘了公共VAR的坏习惯等)


现在我的问题是,如果我使用实例锁创建一个锁块(this),这会阻止其他线程操纵属性money吗?或者我是否需要将money属性设置为私有,并使用synchronize修饰符定义getter/setter,以确保该值不存在运行到竞争条件的风险?

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


正如您所猜测的,您必须将变量
设置为私有
,并将同步添加到setter方法中,以确保安全。只需确保在同一个锁上同步。

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


正如您所猜测的,您必须将变量
设置为私有
,并将同步添加到setter方法中,以确保安全。只需确保在同一个锁上进行同步。

您可以将其视为每个对象实例拥有一个“票证”(称为其监视器)。当线程想要进入某个特定对象上的
同步的
块时,该线程必须首先从该对象“获取票证”,然后在退出该块或调用
wait()
时将票证交回

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


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

您可以将其视为每个对象实例拥有一张“票证”(称为其监视器)。当线程想要进入某个特定对象上的
同步的
块时,该线程必须首先从该对象“获取票证”,然后在退出该块或调用
wait()
时将票证交回

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


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

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

上同步此
对象的内容完全无关。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;