正确使用Java Synchronized的方法?

时间:2011-01-31 20:43:36

标签: java synchronization synchronized

我正在构建一个库存系统,该系统将用于具有多个用户的办公室局域网。我有一个关于使用synchronized关键字正确更新库存的查询。我想做的是允许多个用户更新库存,但当然只允许一个用户一次更新。我已经为库存更新创建了如下方法:

public static synchronized boolean UpdateXYZStock(Stock so){
 //update code
}

这是正确的方法吗?

由于

S上。

4 个答案:

答案 0 :(得分:4)

我会锁定对象的实例,而不是类。即,因为您正在锁定类,所以不要锁定静态方法。除此之外,您可能希望锁定基础对象,例如

private final Object writeLock = new Object();

public boolean UpdateXYZStock(Stock so) {
   synchronized(writeLock) {
      ...
   }
}

因此您可以更精细地控制锁定的粒度(我假设此方法位于服务器中的组件上,从而为多个客户端提供服务)

答案 1 :(得分:1)

同步静态方法的唯一问题是您实际上是在整个类上进行同步。因此,如果该类中有多个静态方法,则此类同步的事实将阻止其他类访问任何静态方法,直到此方法完成。

否则应该完成你想要的。

答案 2 :(得分:0)

您还可以考虑使用ReadWriteLock

答案 3 :(得分:0)

以这种方式使用synchronized很好。这取决于您实际存储数据的位置。如果它只是存储在对象中,请使用此对象的监视器,即非静态同步方法。

如果将数据存储在数据库中,请确保更新表中此行的所有代码都使用相同的锁。正如其他回复中所强调的那样,这可以是通过静态字段提供的对象。 (只是不要使用字符串作为监视器)。