update Rocket.md

pull/6/head
yuanguangxin 5 years ago
parent c71690d03e
commit 6edfb501de

@ -2,9 +2,7 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="af7ffdf2-4ddc-4ed6-8222-60ed5acbc2ed" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/src/动态规划/q300_最长上升子序列/Solution.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -284,7 +282,7 @@
<workItem from="1583497707004" duration="210000" />
<workItem from="1583849488567" duration="869000" />
<workItem from="1583927904095" duration="1482000" />
<workItem from="1584281287922" duration="2034000" />
<workItem from="1584281287922" duration="2464000" />
</task>
<task id="LOCAL-00001" summary="add q5/q7/q172">
<created>1580045439607</created>
@ -622,7 +620,14 @@
<option name="project" value="LOCAL" />
<updated>1583851879205</updated>
</task>
<option name="localTasksCounter" value="49" />
<task id="LOCAL-00049" summary="add q300">
<created>1584289863273</created>
<option name="number" value="00049" />
<option name="presentableId" value="LOCAL-00049" />
<option name="project" value="LOCAL" />
<updated>1584289863273</updated>
</task>
<option name="localTasksCounter" value="50" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
@ -675,7 +680,6 @@
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="add q23/q101" />
<MESSAGE value="add q94/98/144/145" />
<MESSAGE value="update q98" />
<MESSAGE value="add q110/q450/q701" />
@ -700,7 +704,8 @@
<MESSAGE value="add q215/q347" />
<MESSAGE value="add q316" />
<MESSAGE value="add q226" />
<option name="LAST_COMMIT_MESSAGE" value="add q226" />
<MESSAGE value="add q300" />
<option name="LAST_COMMIT_MESSAGE" value="add q300" />
</component>
<component name="WindowStateProjectService">
<state x="320" y="115" key="#Inspections" timestamp="1581061018990">
@ -715,10 +720,10 @@
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="533" y="166" key="#com.intellij.ide.util.MemberChooser/0.0.1440.900@0.0.1440.900" timestamp="1578548165321" />
<state x="303" y="50" key="CommitChangelistDialog2" timestamp="1584289852645">
<state x="303" y="50" key="CommitChangelistDialog2" timestamp="1584289862834">
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="303" y="50" key="CommitChangelistDialog2/0.0.1440.900@0.0.1440.900" timestamp="1584289852645" />
<state x="303" y="50" key="CommitChangelistDialog2/0.0.1440.900@0.0.1440.900" timestamp="1584289862834" />
<state x="144" y="78" width="1152" height="720" key="DiffContextDialog" timestamp="1582971909377">
<screen x="0" y="0" width="1440" height="900" />
</state>
@ -773,10 +778,10 @@
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="221" y="63" key="SettingsEditor/0.0.1440.900@0.0.1440.900" timestamp="1583244442349" />
<state x="320" y="190" key="Vcs.Push.Dialog.v2" timestamp="1583851880820">
<state x="320" y="190" key="Vcs.Push.Dialog.v2" timestamp="1584289864769">
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="320" y="190" key="Vcs.Push.Dialog.v2/0.0.1440.900@0.0.1440.900" timestamp="1583851880820" />
<state x="320" y="190" key="Vcs.Push.Dialog.v2/0.0.1440.900@0.0.1440.900" timestamp="1584289864769" />
<state x="100" y="100" width="1240" height="700" key="com.intellij.history.integration.ui.views.DirectoryHistoryDialog" timestamp="1581744794182">
<screen x="0" y="23" width="1440" height="797" />
</state>

@ -374,6 +374,14 @@ ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对
一个线程内可以存在多个 ThreadLocal 对象,所以其实是 ThreadLocal 内部维护了一个 Map ,这个 Map 不是直接使用的 HashMap ,而是 ThreadLocal 实现的一个叫做 ThreadLocalMap 的静态内部类。而我们使用的 get()、set() 方法其实都是调用了这个ThreadLocalMap类对应的 get()、set() 方法。
### ThreadLocal为什么要使用弱引用和内存泄露问题
Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对key.每个key都弱引用指向threadlocal.假如每个key都强引用指向threadlocal也就是上图虚线那里是个强引用那么这个threadlocal就会因为和entry存在强引用无法被回收造成内存泄漏 除非线程结束线程被回收了map也跟着回收。
虽然上述的弱引用解决了key也就是线程的ThreadLocal能及时被回收但是value却依然存在内存泄漏的问题。当把threadlocal实例置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal将会被gc回收.map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露,因为存在一条从current thread连接过来的强引用.只有当前thread结束以后, current thread就不会存在栈中,强引用断开, Current Thread, Map, value将全部被GC回收.所以当线程的某个localThread使用完了马上调用threadlocal的remove方法,就不会发生这种情况了。
另外其实只要这个线程对象及时被gc回收这个内存泄露问题影响不大但在threadLocal设为null到线程结束中间这段时间不会被回收的就发生了我们认为的内存泄露。最要命的是线程对象不被回收的情况这就发生了真正意义上的内存泄露。比如使用线程池的时候线程结束是不会销毁的会再次使用就可能出现内存泄露。
### HashSet和HashMap
HashSet的value存的是一个static finial PRESENT = newObject()。而HashSet的remove是使用HashMap实现,则是map.remove而map的移除会返回value,如果底层value都是存null,显然将无法分辨是否移除成功。

Loading…
Cancel
Save