锁定私有字段变量(而不是使用锁定对象)是否安全/可接受的做法?这样,我就可以为不同的目的使用不同的锁。下面的例子:
class Test {
private Integer x = 0;
private Integer y = 0;
public void incrementX() {
synchronized(x) {
x++;
}
}
public void decrementX() {
synchronized(x) {
x++;
}
}
public void incrementY() {
synchronized(y) {
y++;
}
}
public void decrementY() {
synchronized(y) {
y++;
}
}
或者我应该为每个想要锁定的私有成员设置一个锁定对象?例子:
class Test {
private final Object xLock = new Object();
private final Object yLock = new Object();
private Integer x = 0;
private Integer y = 0;
...
}
或者我应该只拥有一个通用锁并将其用于所有需要锁定的私有变量?例子:
class Test {
private final Object objLock = new Object();
private Integer x = 0;
private Integer y = 0;
...
}
当心始终使用最终成员变量为了锁!如果您使用Integer
,例如,如果您打算更改它,那么这将是非常糟糕的做法,因为每次调用都会看到一个不同的对象并导致数据争用。
使用一个锁还是多个锁取决于您想要实现的协调方案,因此它完全是特定于域的。您必须仔细考虑哪些操作是互斥的,哪些操作不是互斥的,并适当地为它们分配锁。这里没有单一的最佳实践。
如果您的对象上有两个正交操作可能同时发生而不会导致任何数据争用,那么这就是两个锁的情况。在您的示例中,有两个整数,每个整数都独立变化。我认为这是两把锁的情况。如果您有更复杂的代码,其中至少在一个操作中需要访问两个整数,那么这会将它们绑定在一起,然后您将需要一个锁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)