Как предотвратить сильное обращение значения к его ключу?

Гораздо лучший программист, чем я, сообщил мне, что он хранит карту своих WebSocket соединений с java-websocket в файле WeakHashMap. Я изучил эту карту для себя, и она кажется идеальной, поскольку соединение будет закрыто без немедленного уведомления потока, ответственного за удержание карты, что позволит собирать мусор для закрытых соединений.

В документах я заметил, что "The объекты значений в WeakHashMap хранятся с помощью обычных сильных ссылок. Таким образом, следует позаботиться о том, чтобы объекты значений не ссылались строго на свои собственные ключи, прямо или косвенно, поскольку это предотвратит отбрасывание ключей.».

Означает ли это, что значение никогда не должно ссылаться на свой или любой другой ключ в WeakHashMap, чтобы не предотвратить сборку мусора?

А как именно делается сильная ссылка по значению на свой ключ?

Например, мне нужно хранить список IP- и DNS-адресов, связанных с ключом, соединением. Как я могу гарантировать, что это не сильные ссылки на ключ InetSocketAddress, а затем InetAddress?


person Community    schedule 03.02.2014    source источник


Ответы (1)


Означает ли это, что значение никогда не должно ссылаться на свой или любой другой ключ в WeakHashMap, чтобы не предотвратить сборку мусора?

Значение не должно ссылаться на собственный ключ, но может ссылаться на другие ключи.

А как именно делается сильная ссылка по значению на свой ключ?

Если ключи Strings, а значения имеют поле данных String, вы можете установить это поле String на ключ объекта, чтобы создать сильную ссылку из значения на его ключ.

Например, мне нужно хранить список IP- и DNS-адресов, связанных с ключом, соединением. Как я могу гарантировать, что это не сильные ссылки на ключ InetSocketAddress, а затем InetAddress?

InetAddress не имеет сильной ссылки на соединение, из которого вы его получили. Не существует конструктора, который принимает WebSocket, поэтому InetAddress никак не может иметь ссылку на WebSocket, из которого вы его получили.

person tbodt    schedule 03.02.2014
comment
Спасибо, тбодт! Будет ли String значения InetAddress из значения InetSocketAddress из ключа сильной ссылкой? Огромное спасибо заранее! - person ; 03.02.2014
comment
Спасибо еще раз! Я все еще новичок в Java, поэтому не могли бы вы объяснить немного более подробно с примерами, как List<String> из InetAddress значений будет и не будет строго ссылаться на ключ? Я не уверен, как предотвратить это, поскольку InetAddress исходит из ключа. Я использую первую половину этого ответа. stackoverflow.com/a/494480/1382306 Еще раз большое спасибо заранее! - person ; 03.02.2014
comment
Несмотря на то, что InetAddress происходит от ключа, InetAddress не имеет сильной ссылки на ключ. - person tbodt; 03.02.2014