Q2. Существует ли какой-либо действительный вариант использования для локальных (определенных внутри некоторого метода) локальных потоков?
Во-первых, давайте просто проясним. Если вы говорите «местный Foobar
» (для любого class Foobar
), то не совсем понятно, о чем вы говорите. Переменные могут быть «уровня класса» (т. Е. static
) или «уровня экземпляра» или «локально»; но экземпляр Foobar
является , а не переменной. Переменные в программе Java могут только ссылаться на - Foobar
экземпляры, которые размещены в куче. Это очень легко, и очень часто иметь в программе более одной переменной, ссылающейся на один и тот же экземпляр.
ThreadLocal
- это класс, а экземпляры ThreadLocal
- это объекты в куче. На один и тот же объект ThreadLocal
может ссылаться переменная static ThreadLocal
, а также, в то же время, локальные переменные в одном или нескольких потоках.
Когда вы говорите "локальный ThreadLocal
" Вы могли бы говорить о локальной переменной , которая содержит ссылку на экземпляр ThreadLocal
, который используется совместно с другими потоками, -OR- , о котором вы могли говорить о ThreadLocal
экземпляре, который только ссылается на одну локальную переменную. Второй случай не будет иметь никакого смысла, потому что этот экземпляр не может быть совместно использован несколькими потоками.
Q1. Существует ли какой-либо действительный вариант использования для экземпляра с областью действия (не -stati c) нить локальных?
Может быть и так, но я бы назвал это " запах кода ." (То есть причина внимательно посмотреть на код и посмотреть, можно ли его лучше организовать.) Я лично никогда бы не использовал ThreadLocal
в новом коде. Единственный раз, когда я его использовал, это когда я переносил старый однопоточный код в многопоточную систему; и когда я это делал, рассматриваемые переменные всегда были static
(то есть, на уровне класса).
I лично старались никогда не использовать static
в новом коде, кроме случаев где какая-то функция явно помечена как возвращающая ссылку на «одноэлементный объект».
Q3., Q4. [... когда удаляются экземпляры .. .]?
Экземпляр будет приемлемым , который будет удален, если в программе нет "живой" переменной, которая ссылается на нее. Это может произойти, если единственная переменная, которая ссылается на нее, является локальной переменной некоторой функции, и эта функция возвращает. Второй способ это может произойти, если единственная переменная, которая ссылается на экземпляр, назначена для ссылки на какой-либо другой экземпляр. Третий способ - это если единственные ссылки на него взяты из переменных экземпляра других объектов, и все эти другие объекты сами по себе могут быть удалены.
В большинстве реализаций Java экземпляр не будет немедленно удаляется, когда становится приемлемым для удаления. Фактическое удаление произойдет через некоторое время. Когда, зависит от стратегий, используемых JRE сборщиком мусора и от шаблонов использования объектов программой.