2015-03-30 6 views
0

Я хочу написать прокси-сервер, чтобы гарантировать, что конкретный объект используется только в конкретном потоке, поэтому мне нужно сохранить ссылку на объект Thread (так как JavaDoc говорит, что идентификатор можно использовать повторно). Будет ли эта ссылка заставлять поток (а не объект Thread) не полностью собирать мусор, когда он завершается?Будет ли ссылка на объект Thread вызывать утечку памяти?

+2

Это приведет к тому, что 'Thread' не будет собрано мусором, и все объекты будут доступны из него. * Thread * является объектом операционной системы и вообще не подлежит сборке мусора. Ваш вопрос не имеет смысла. – EJP

+0

Я думаю, что я уже настолько ясен, насколько могу: есть экземпляр класса «Thread» (т. Е. Объект «Thread»), который мой собственный экземпляр хочет удержать, и есть поток JVM (как концепция планирования). Первый из них раскрывает методы управления последним, но неясно, будут ли удерживать ссылки на первые, чтобы последний был полностью собран в мусор (учитывая ThreadLocals и опыт по утечкам потоков). –

+0

Не только ваш вопрос звучит странно, но и весь дизайн. Почему именно вам кажется, что только одному конкретному потоку должно быть разрешено обновлять (читать, писать?) Конкретный объект? Я имею в виду: есть ли время жизни этого объекта и что поток «манипуляции» отличается? – GhostCat

ответ

0

Я хочу написать прокси-сервер для обеспечения определенного объекта только когда-либо использовал на конкретную тему, так что мне нужно хранить ссылку на объект Thread

Вы не делаете. Вы можете использовать ThreadLocal<Boolean>, который устанавливается только в конкретном потоке.

Будет ли эта ссылка заставлять поток (а не объект Thread) не полностью собирать мусор, когда он завершается?

Ваша ссылка приведет к утечке Thread, но, как писал @superbob, неуказано, что происходит с потоком ОС. Мне было бы безразлично, если бы вы знали, что это единственная нить.

Хотя ThreadLocal может leak тоже простой ThreadLocal<Boolean> без подклассов (особенно без использования initialValue()) не просачивается ничего.


Внешняя библиотека Я использую имеет объектную бассейн, но где-то в код базовых объектов возвращаются в пул преждевременно в результате не-поточно-объект используется в нескольких потоках. Я хочу написать прокси-сервер для обнаружения такого случая. Прокси-сервер должен хранить ссылку на currentThread, когда объект был выведен из пула и бросать, если вызывающий поток отличается от сохраненного Thread.

Это звучит совсем не так, как ваш вопрос, и кажется, что мой ответ выше недействителен. Я написал такую ​​вещь некоторые давным-давно:

import com.google.common.collect.MapMaker; 

public static synchronized boolean singleThreaded(Object o) { 
    final Thread neu = Thread.currentThread(); 
    final Thread old = threadMap.put(o, neu); 
    return old==null || old==neu; 
} 

private final static Map<Object, Thread> threadMap = 
    new MapMaker().weakKeys().weakValues().makeMap(); 

и использовать его при отладке для обеспечения того, чтобы someObject привыкает в одном потоке с помощью

assert singleThreaded(someObject) 

Из-за все ссылки являются слабыми, я могу надеяться, нет утечки

+0

Да, я пошел слабый ссылочный путь в конце концов, как хорошо. –

Смежные вопросы