Если вы хотите, чтобы ArrayList
s сохранял per- информацию о клиенте и доступ к ней по идентификатору клиента, я предлагаю использовать только java.util.concurrent.ConcurrentHashMap
с идентификатором клиента в качестве ключа, поскольку это очень просто реализовать.
Если вам действительно нужен ArrayList
, я бы спрятал его как деталь реализации в код сервера. Затем вы вызовете некоторые методы сервера из своего Runnable
s, чтобы обновить ArrayList
. Таким образом, вы можете начать с чем-то очень простым, как:
public class Server {
...
private ArrayList<Info> infos = new ArrayList<Info>();
...
// Create one method for each *abstract* operation
// that you need to perform on the ArrayList
// (Do *NOT* implement read/write primitives
// unless that is exactly what you need. The idea is
// that all synchronization that you might need on
// the ArrayList happens inside those methods, so
// the Runnables are unaware of the implementation
// you haven chosen.)
// Here I have used example operations that are
// a bit more complex than read/write primitives
// so the intention is more clear.
public void clearInfo(int pos) {
synchronized (infos) {
infos.set(pos, null);
}
}
public Info updateInfo(int pos, Info info) {
Info oldInfo = null;
synchronized (infos) {
oldInfo = infos.get(pos);
infos.set(pos, info);
}
return oldInfo;
}
...
public Info readInfo(int pos) {
Info info = null;
synchronized (infos) {
infos.get(pos);
info.incrementReadCount();
}
return null;
}
...
}
...
public class ClientRunnable implements Runnable {
...
private Server server;
...
@Override
public void run() {
...
Info info = // getInfo();
int writePos = // getWritePos();
Info old = server.updateInfo(writePos, info);
...
int readPos = // getReadPos();
Info newInfo = server.readInfo(readPos);
...
}
...
}
Затем, когда вы профилирование приложения, если вы найдете раздор в доступе к вашему списку вы можете настроить блокировку или даже изменить свою реализацию в замок- при этом минимизируя влияние на ваш код. В настоящее время блокировка в Java довольно быстро, поэтому во многих случаях это простое решение может быть достаточно хорошим.
Статический вектор может быть тем, что вы ищете. – JustinKSU
@ JustinKSU конечно, если вы хотите стрелять в свои ноги :) –
Что-то из java.util.concurrent было бы лучше. – JustinKSU