Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java同步的正确方法?_Java_Synchronization_Synchronized - Fatal编程技术网

使用Java同步的正确方法?

使用Java同步的正确方法?,java,synchronization,synchronized,Java,Synchronization,Synchronized,我正在建立一个股票系统,它将在一个有多个用户的办公室局域网上使用。我有一个关于使用synchronized关键字正确更新股票的查询。我想做的是允许多个用户更新股票,但当然一次只允许一个用户更新股票。我创建了一个更新股票的方法,如下所示: public static synchronized boolean UpdateXYZStock(Stock so){ //update code } 这是正确的方法吗 谢谢 我会锁定对象的实例,而不是类。i、 不要锁定静态方法,因为您正在锁定该类。此外,

我正在建立一个股票系统,它将在一个有多个用户的办公室局域网上使用。我有一个关于使用synchronized关键字正确更新股票的查询。我想做的是允许多个用户更新股票,但当然一次只允许一个用户更新股票。我创建了一个更新股票的方法,如下所示:

public static synchronized boolean UpdateXYZStock(Stock so){
 //update code
}
这是正确的方法吗

谢谢

我会锁定对象的实例,而不是类。i、 不要锁定静态方法,因为您正在锁定该类。此外,您可能希望锁定底层对象,例如

private final Object writeLock = new Object();

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

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

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


否则应该完成你想要的。

你也可以考虑使用.

使用<代码>同步< /C> >,这样就可以了。这取决于实际存储数据的位置。如果只是存储在对象中,请使用此对象的监视器,即非静态同步方法


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

您需要在此处提供更多详细信息。java synchronized不跨虚拟机。您可以考虑让数据库处理这样的同步问题。让UpdateStock()更新数据库中的stock值。我在类中有其他静态方法,因此我认为Brian的建议更合适,如果我锁定一个底层对象,这是否可以保证更新代码只执行一次,即如果有多个用户,他们不能同时更新,他们必须依次等待更新库存?没错。另外请注意,如果可以的话,您应该使用数据库中的事务和保证的原子性。非常感谢Brian!代码存储在数据库中。您对数据库使用乐观锁定协议还是悲观锁定协议?我想在这种情况下,您根本不需要同步。持久层将确定您是否正在更新过时的数据。