在阅读了有关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数据成员? 感谢。
答案 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
打包成一个所有方法同步的文件。
这是否比同步类中的方法更好取决于你的方法做了什么,以及是否还需要协调这些方法。