是否可以同步数据成员而不是方法?

时间:2011-10-03 21:15:00

标签: java

在阅读了有关Java同步方法的主题之后,我尝试在我的多人游戏中实现它,因为许多线程都被打开并试图访问相同的资源。 我已经使方法同步,但这对我没有帮助,因为如果我有一个名为ArrayList的数据成员clientConnection;以及可用的方法是:

int getArrayListSize() {
    clientConnection.size();
}

void addConnection(ServerConnection i_connection) {
    clientConnection.add(i_connection);
}

void removeConnection(ServerConnection i_connection) {
    int index = clientConnections.indexOf(i_Connection);
    clientConnections.remove(index);
}

ServerConnection getClientFromArrayListByIndex(int i_Index) {
    ServerConnection client = this.clientConnections.get(i_Index);
}

我试图创建一个全局同步的方法,只要有人想要使用其中一种方法传递一个操作类型和其他数据,他就会锁定该函数。 问题是有2个函数返回void,1返回int,1返回ServerConnection,因此我无法创建该全局方法。 我的问题是否有可能锁定数据成员而不是Java中的方法,所以我可以锁定clientConnection数据成员? 感谢。

4 个答案:

答案 0 :(得分:3)

如果你使所有这些方法同步,那么一次只有一个线程能够调用任何方法,因此只有这些方法能够访问才能以线程安全的方式访问列表列表(即列表是私有的,没有其他方法使用该列表)。

synchronized int getArrayListSize() { ... }
synchronized void addConnection(ServerConnection i_connection) { ... }
etc.

答案 1 :(得分:0)

您可以使用synchronized关键字同步功能。例如:

synchronized ServerConnection getClientFromArrayListByIndex(int i_Index) { 
    ServerConnection client = this.clientConnections.get(i_Index);
    // ...
}

答案 2 :(得分:0)

如果您有一个课程,则可以使用synchronized为您的方法添加前缀;那么这些方法中只有一个线程。但请想想你是否真的需要这个;它可能会减慢执行速度。如果您有公共字段,则应将其设为私有字段并创建getter方法。

答案 3 :(得分:0)

您可以使用Collections.synchronizedList()List打包成一个所有方法同步的文件。

这是否比同步类中的方法更好取决于你的方法做了什么,以及是否还需要协调这些方法。