spe*_*ndo 20 java multithreading locking synchronized
我想知道java中的"同步"是如何工作的.
假设我模拟了一个由许多领域组成的棋盘游戏.我将字段实现为类(字段),将字符串实现为包含许多字段的类(Board).让我们进一步说我在Field中建模一个方法moveTo(Player pl),让玩家移动到那个区域.每个玩家都由一个线程代表.
虽然所有线程都应该同时执行某些操作(例如滚动骰子),但一次只能有一个玩家移动.
我该如何确保?是否足以使方法moveTo(Player pl)同步?或者我是否需要在Board中使用级联方法来确保一次只有一个玩家移动?(或者有更好的解决方案)?
将它带到底线:
"同步"会锁定具有此方法的每个对象中的方法,还是仅在当前正在使用的对象中同步锁定方法?
如果第二种情况是:是否有一种简单的方法来锁定实现此方法的每个对象的方法?
谢谢!!!
jjn*_*guy 29
我认为你想要的是以下内容:
class Field {
// instance of the board
private Board board;
public void moveTo(Player p){
synchronized (board) {
// move code goes here
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将使每个棋盘只有一个玩家一次移动.如果您在板上获得同步锁定,则一次只能有一个Field进入同步锁定.(假设一块板)
如果你只是写道:
public synchronized void moveTo(Player p){
Run Code Online (Sandbox Code Playgroud)
你只能确保玩家不能一次移动到同一个领域.这是因为当在定义中使用synchronized写入方法时,它将锁定在对象级别.因此,Field的每个实例都将是它自己的锁定对象,因此,只要玩家不移动到同一个Field,玩家仍然可以同时移动.
synchronized锁定对象,而不是方法.Java没有功能.
如果希望在所有对象上只调用一次方法,则可以锁定共享对象,例如类.
我建议你只需要一个线程来执行所有的移动/操作,这将显着简化代码.为什么它必须是多线程的?
归档时间: |
|
查看次数: |
21629 次 |
最近记录: |