Предположим, у меня есть класс:Как гарантировать синхронизацию всех безобидных ссылок на объект?
public final class Server {
private final ArrayList<ServerConnection> connections;
private ServerConnection pending;
private Thread connector;
public Server() {
connections = new ArrayList<>();
connector = new Thread(() -> {
while (true) {
pending = new ServerConnection();
pending.waitForConnection();
//Could be adding while another thread is iterating.
connections.add(pending);
}
}, "Connection Establisher");
connector.setDaemon(true);
connector.setPriority(Thread.MIN_PRIORITY);
connector.start();
}
//Anyone with a refrence to this object can access connections.
public ArrayList<ServerConnection> getConnections() {
return connections;
}
}
Как бы убедиться, что connections
не используется в то время как я добавить объект. Я думал об использовании блока synchronized (connections) {...}
в потоке, но, насколько мне известно, synchronized
блокирует все безобидные ссылки на connections
, должен быть в синхронизированном блоке. Есть ли способ, которым я могу убедиться, что весь небезопасный доступ к connections
синхронизирован?