blob: e4b0ddb364cfd6c44b512d7551e88738151321a9 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.3"/>
<title>Lucene.Net: Lucene.Net.Util.CloseableThreadLocal&lt; T &gt; Class Template Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="lucene-net-icon-128x128.png"/></td>
<td style="padding-left: 0.5em;">
<div id="projectname">Lucene.Net
&#160;<span id="projectnumber">3.0.3</span>
</div>
<div id="projectbrief">Lucene.Net is a .NET port of the Java Lucene Indexing Library</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.3 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="Index.html"><span>Main&#160;Page</span></a></li>
<li><a href="namespaces.html"><span>Packages</span></a></li>
<li class="current"><a href="annotated.html"><span>Classes</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="annotated.html"><span>Class&#160;List</span></a></li>
<li><a href="classes.html"><span>Class&#160;Index</span></a></li>
<li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class&#160;Members</span></a></li>
</ul>
</div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Properties</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="namespace_lucene.html">Lucene</a></li><li class="navelem"><a class="el" href="namespace_lucene_1_1_net.html">Net</a></li><li class="navelem"><a class="el" href="namespace_lucene_1_1_net_1_1_util.html">Util</a></li><li class="navelem"><a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local_3_01_t_01_4.html">CloseableThreadLocal< T ></a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pro-methods">Protected Member Functions</a> &#124;
<a href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local_3_01_t_01_4-members.html">List of all members</a> </div>
<div class="headertitle">
<div class="title">Lucene.Net.Util.CloseableThreadLocal&lt; T &gt; Class Template Reference</div> </div>
</div><!--header-->
<div class="contents">
<p>Java's builtin ThreadLocal has a serious flaw: it can take an arbitrarily long amount of time to dereference the things you had stored in it, even once the ThreadLocal instance itself is no longer referenced. This is because there is single, master map stored for each thread, which all ThreadLocals share, and that master map only periodically purges "stale" entries.
<a href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local_3_01_t_01_4.html#details">More...</a></p>
<p>Inherits IDisposable.</p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a0c0f3ddc087954994999cfceb3bd0b61"><td class="memItemLeft" align="right" valign="top">virtual T&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local_3_01_t_01_4.html#a0c0f3ddc087954994999cfceb3bd0b61">InitialValue</a> ()</td></tr>
<tr class="separator:a0c0f3ddc087954994999cfceb3bd0b61"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a712c50ed33108224ad1e3013ed4a5a9b"><td class="memItemLeft" align="right" valign="top">virtual T&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local_3_01_t_01_4.html#a712c50ed33108224ad1e3013ed4a5a9b">Get</a> ()</td></tr>
<tr class="separator:a712c50ed33108224ad1e3013ed4a5a9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5b6d6ce109264506c8b71847e242d43a"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local_3_01_t_01_4.html#a5b6d6ce109264506c8b71847e242d43a">Set</a> (T @object)</td></tr>
<tr class="separator:a5b6d6ce109264506c8b71847e242d43a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3f6dd15bc68515bb838c6fca01f2e996"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local_3_01_t_01_4.html#a3f6dd15bc68515bb838c6fca01f2e996">Close</a> ()</td></tr>
<tr class="separator:a3f6dd15bc68515bb838c6fca01f2e996"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5bb097f173ae2ba4eb387adfacd2d64b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local_3_01_t_01_4.html#a5bb097f173ae2ba4eb387adfacd2d64b">Dispose</a> ()</td></tr>
<tr class="separator:a5bb097f173ae2ba4eb387adfacd2d64b"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
Protected Member Functions</h2></td></tr>
<tr class="memitem:a7e780efc7ea5f1f410a2cb413ffef3dc"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local_3_01_t_01_4.html#a7e780efc7ea5f1f410a2cb413ffef3dc">Dispose</a> (bool disposing)</td></tr>
<tr class="separator:a7e780efc7ea5f1f410a2cb413ffef3dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Java's builtin ThreadLocal has a serious flaw: it can take an arbitrarily long amount of time to dereference the things you had stored in it, even once the ThreadLocal instance itself is no longer referenced. This is because there is single, master map stored for each thread, which all ThreadLocals share, and that master map only periodically purges "stale" entries. </p>
<p>While not technically a memory leak, because eventually the memory will be reclaimed, it can take a long time and you can easily hit OutOfMemoryError because from the GC's standpoint the stale entries are not reclaimaible.</p>
<p>This class works around that, by only enrolling WeakReference values into the ThreadLocal, and separately holding a hard reference to each stored value. When you call <a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local_3_01_t_01_4.html#a3f6dd15bc68515bb838c6fca01f2e996">Close</a>, these hard references are cleared and then GC is freely able to reclaim space by objects stored in it. </p>
<div class="typeconstraint">
<dl><dt><b>Type Constraints</b><dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><em>T</em></td><td>&#160;:</td><td valign="top"><em>class</em></td><td>&#160;</td></tr>
</table>
</dl>
</div>
<p>Definition at line <a class="el" href="_closeable_thread_local_8cs_source.html#l00053">53</a> of file <a class="el" href="_closeable_thread_local_8cs_source.html">CloseableThreadLocal.cs</a>.</p>
</div><h2 class="groupheader">Member Function Documentation</h2>
<a class="anchor" id="a3f6dd15bc68515bb838c6fca01f2e996"></a>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">virtual void <a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local.html">Lucene.Net.Util.CloseableThreadLocal</a>&lt; T &gt;.Close </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Definition at line <a class="el" href="_closeable_thread_local_8cs_source.html#l00117">117</a> of file <a class="el" href="_closeable_thread_local_8cs_source.html">CloseableThreadLocal.cs</a>.</p>
</div>
</div>
<a class="anchor" id="a5bb097f173ae2ba4eb387adfacd2d64b"></a>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void <a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local.html">Lucene.Net.Util.CloseableThreadLocal</a>&lt; T &gt;.Dispose </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Definition at line <a class="el" href="_closeable_thread_local_8cs_source.html#l00122">122</a> of file <a class="el" href="_closeable_thread_local_8cs_source.html">CloseableThreadLocal.cs</a>.</p>
</div>
</div>
<a class="anchor" id="a7e780efc7ea5f1f410a2cb413ffef3dc"></a>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">virtual void <a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local.html">Lucene.Net.Util.CloseableThreadLocal</a>&lt; T &gt;.Dispose </td>
<td>(</td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>disposing</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Definition at line <a class="el" href="_closeable_thread_local_8cs_source.html#l00127">127</a> of file <a class="el" href="_closeable_thread_local_8cs_source.html">CloseableThreadLocal.cs</a>.</p>
</div>
</div>
<a class="anchor" id="a712c50ed33108224ad1e3013ed4a5a9b"></a>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">virtual T <a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local.html">Lucene.Net.Util.CloseableThreadLocal</a>&lt; T &gt;.Get </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Definition at line <a class="el" href="_closeable_thread_local_8cs_source.html#l00067">67</a> of file <a class="el" href="_closeable_thread_local_8cs_source.html">CloseableThreadLocal.cs</a>.</p>
</div>
</div>
<a class="anchor" id="a0c0f3ddc087954994999cfceb3bd0b61"></a>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">virtual T <a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local.html">Lucene.Net.Util.CloseableThreadLocal</a>&lt; T &gt;.InitialValue </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Definition at line <a class="el" href="_closeable_thread_local_8cs_source.html#l00062">62</a> of file <a class="el" href="_closeable_thread_local_8cs_source.html">CloseableThreadLocal.cs</a>.</p>
</div>
</div>
<a class="anchor" id="a5b6d6ce109264506c8b71847e242d43a"></a>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">virtual void <a class="el" href="class_lucene_1_1_net_1_1_util_1_1_closeable_thread_local.html">Lucene.Net.Util.CloseableThreadLocal</a>&lt; T &gt;.Set </td>
<td>(</td>
<td class="paramtype">T @&#160;</td>
<td class="paramname"><em>object</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Definition at line <a class="el" href="_closeable_thread_local_8cs_source.html#l00087">87</a> of file <a class="el" href="_closeable_thread_local_8cs_source.html">CloseableThreadLocal.cs</a>.</p>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>core/Util/<a class="el" href="_closeable_thread_local_8cs_source.html">CloseableThreadLocal.cs</a></li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Thu Jan 3 2013 02:12:59 for Lucene.Net by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.3
</small></address>
</body>
</html>