我正在尝试理解java中使用同步关键字的锁是如何工作的。如果我有一个类(忘记那些糟糕的做法,比如使用public var,等等)
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,以确保此值不会有遇到竞争条件的风险?
发布于 2013-05-27 03:10:19
您提供的代码只会阻止其他线程通过give_bonus()方法修改money变量,直到该方法返回为止(或者更确切地说,就在该方法返回之前)。
如您所料,为了安全起见,您必须将变量设置为private,并将同步添加到setter方法。只需确保在同一个锁上同步即可。
发布于 2013-05-27 03:26:28
在this上同步与this对象的内容没有任何关系。Java的锁定机制基本上是搭载在常规对象上,这些对象扮演着与它们的“对象性”完全分开的另一个角色。另一个角色涉及每个对象中的一个特殊字段,称为其监视器,记录哪个线程获取了它以及获得了多少次。
发布于 2013-05-27 03:20:52
你可以把它想象成每个对象实例拥有一个“票证”(称为它的监视器)。当一个线程想要进入一个在特定对象上是synchronized的块时,该线程必须首先从该对象“获取票证”,然后在退出该块或调用wait()时将票证交回。
如果票证当前不可用(因为另一个线程在相同的或需要相同票证的另一个同步块中),那么它必须等待。
在您的示例中,没有什么可以阻止线程2直接访问money -线程1在synchronized块中的事实只是阻止线程2同时进入同一监视器上的synchronized块。
https://stackoverflow.com/questions/16762747
复制相似问题