"同步"究竟做了什么?锁定函数或锁定对象函数?

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,玩家仍然可以同时移动.


Pet*_*rey 7

synchronized锁定对象,而不是方法.Java没有功能.

如果希望在所有对象上只调用一次方法,则可以锁定共享对象,例如类.

我建议你只需要一个线程来执行所有的移动/操作,这将显着简化代码.为什么它必须是多线程的?

  • @Marcel:嗯.那要看.在python中你可以锁定函数,但这是函数作为对象的结果. (2认同)