首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java同步修饰符

Java同步修饰符
EN

Stack Overflow用户
提问于 2013-05-27 03:07:52
回答 3查看 212关注 0票数 0

我正在尝试理解java中使用同步关键字的锁是如何工作的。如果我有一个类(忘记那些糟糕的做法,比如使用public var,等等)

代码语言:javascript
复制
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 )创建一个锁块,这会阻止其他线程操纵属性money吗?或者,我是否需要将money属性设置为私有,并使用synchronize修饰符定义getter / setter,以确保此值不会有遇到竞争条件的风险?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-27 03:10:19

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

如您所料,为了安全起见,您必须将变量设置为private,并将同步添加到setter方法。只需确保在同一个锁上同步即可。

票数 2
EN

Stack Overflow用户

发布于 2013-05-27 03:26:28

this上同步与this对象的内容没有任何关系。Java的锁定机制基本上是搭载在常规对象上,这些对象扮演着与它们的“对象性”完全分开的另一个角色。另一个角色涉及每个对象中的一个特殊字段,称为其监视器,记录哪个线程获取了它以及获得了多少次。

票数 1
EN

Stack Overflow用户

发布于 2013-05-27 03:20:52

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16762747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档