我正在构建一个库存系统,该系统将用于具有多个用户的办公室局域网。我有一个关于使用synchronized关键字正确更新库存的查询。我想做的是允许多个用户更新库存,但当然只允许一个用户一次更新。我已经为库存更新创建了如下方法:
public static synchronized boolean UpdateXYZStock(Stock so){
//update code
}
这是正确的方法吗?
由于
S上。
答案 0 :(得分:4)
我会锁定对象的实例,而不是类。即,因为您正在锁定类,所以不要锁定静态方法。除此之外,您可能希望锁定基础对象,例如
private final Object writeLock = new Object();
public boolean UpdateXYZStock(Stock so) {
synchronized(writeLock) {
...
}
}
因此您可以更精细地控制锁定的粒度(我假设此方法位于服务器中的组件上,从而为多个客户端提供服务)
答案 1 :(得分:1)
同步静态方法的唯一问题是您实际上是在整个类上进行同步。因此,如果该类中有多个静态方法,则此类同步的事实将阻止其他类访问任何静态方法,直到此方法完成。
否则应该完成你想要的。
答案 2 :(得分:0)
您还可以考虑使用ReadWriteLock。
答案 3 :(得分:0)
以这种方式使用synchronized
很好。这取决于您实际存储数据的位置。如果它只是存储在对象中,请使用此对象的监视器,即非静态同步方法。
如果将数据存储在数据库中,请确保更新表中此行的所有代码都使用相同的锁。正如其他回复中所强调的那样,这可以是通过静态字段提供的对象。 (只是不要使用字符串作为监视器)。