中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

.net 建網(wǎng)站線上教育培訓(xùn)機構(gòu)十大排名

.net 建網(wǎng)站,線上教育培訓(xùn)機構(gòu)十大排名,wordpress4.9安裝出錯,做獨立商城網(wǎng)站問題的提出 在Java多線程中,共享變量的讀寫非常容易出現(xiàn)不可預(yù)測的行為,因此對共享變量的訪問控制非常重要。因此在多線程編程時,為了保證線程安全,需要進行額外的同步措施。比如典型的操作就是加鎖。除了加鎖外,另一…

問題的提出

  • 在Java多線程中,共享變量的讀寫非常容易出現(xiàn)不可預(yù)測的行為,因此對共享變量的訪問控制非常重要。因此在多線程編程時,為了保證線程安全,需要進行額外的同步措施。比如典型的操作就是加鎖。除了加鎖外,另一種常用的方法是使用ThreadLocal , 這種用法在框架中非常普遍。
  • ThreadLocal可以理解為線程本地變量。多個線程對同一個變量如何不互相影響,那么只有對自身獨有的變量訪問(獨占內(nèi)存)時才是線程安全的,因此,ThreadLocal 為變量在每個線程中都創(chuàng)建了一個副本,該副本只能被當(dāng)前線程訪問,多線程之間是隔離的,變量不能在多線程之間共享。這樣每個線程修改變量副本時,不會對其他線程產(chǎn)生影響。

常規(guī)做法

  • 多線程訪問 ThreadLocal 變量時都會有自己獨立的實例副本,要維護線程與變量的對應(yīng)關(guān)系,一種普遍的思維就是在 ThreadLocal 中維護一個映射表 Map 用于記錄線程與實例之間的映射關(guān)系,也就是有一層總控的協(xié)調(diào)在里面。
  • 但是,如果存在總控進行協(xié)調(diào),那么在新增線程和銷毀線程時都需要更新 Map 中的映射關(guān)系時,就會在總控這里產(chǎn)生多線程并發(fā)修改,那么就又產(chǎn)生了額外的操作來保證 Map 是線程安全的。如果是在高并發(fā)的場景并發(fā)修改 Map 需要加鎖,會明顯降低性能。

JDK的實現(xiàn)

  • JDK的 ThreadLocal 提供了一種新的思路,從 Thread 的視角來看,在 Thread 中維護一個 Map用于記錄 ThreadLocal 與實例之間的映射關(guān)系,這樣在同一個線程內(nèi),Map 就不需要加鎖了。

  • 從 Thread 代碼定義看出:Thread類依賴了ThreadLocal.ThreadLocalMap;

public class Thread implements Runnable {/* ThreadLocal values pertaining to this thread. This map is maintained* by the ThreadLocal class. */ThreadLocal.ThreadLocalMap threadLocals = null;
} 
  • 從 ThreadLocal 的代碼來看:
    1. 它的get/set都是從線程取到對應(yīng)的ThreadLocal.ThreadLocalMap;代碼僅以get示例。
    2. 它定義的ThreadLocalMap的 Entry 繼承了WeakReference,Entry的key是弱引用,value是強引用。這樣設(shè)計獲得了另外一個好處:防止內(nèi)存泄漏。在 JVM 垃圾回收時,只要發(fā)現(xiàn)了弱引用的對象,不管內(nèi)存是否充足,都會被回收。如果key是強引用,當(dāng)ThreadLocal不再使用時,ThreadLocalMap中還是存在對ThreadLocal的強引用,那么GC是無法回收的,從而造成內(nèi)存泄漏。
public class ThreadLocal<T> {/*** Returns the value in the current thread's copy of this* thread-local variable.  If the variable has no value for the* current thread, it is first initialized to the value returned* by an invocation of the {@link #initialValue} method.** @return the current thread's value of this thread-local*/public T get() {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null) {ThreadLocalMap.Entry e = map.getEntry(this);if (e != null) {@SuppressWarnings("unchecked")T result = (T)e.value;return result;}}return setInitialValue();}ThreadLocalMap getMap(Thread t) {return t.threadLocals;}static class ThreadLocalMap {/*** The entries in this hash map extend WeakReference, using* its main ref field as the key (which is always a* ThreadLocal object).  Note that null keys (i.e. entry.get()* == null) mean that the key is no longer referenced, so the* entry can be expunged from table.  Such entries are referred to* as "stale entries" in the code that follows.*/static class Entry extends WeakReference<ThreadLocal<?>> {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}}}
}
  • Entry的key設(shè)計成了弱引用,但是當(dāng)ThreadLocal不再使用被 GC 回收后,ThreadLocalMap 中可能出現(xiàn) Entry的key為null,那么Entry的value一直會強引用數(shù)據(jù)而得不到釋放,只能等待線程銷毀。
  • 如何避免ThreadLocalMap內(nèi)存泄漏? ThreadLocal做了如下的保護措施,在執(zhí)行 ThreadLocal.set()/get()方法時,ThreadLocal會調(diào)用expungeStaleEntry方法清除 ThreadLocalMap 中key為null的 Entry 對象,讓它還能夠被 GC 回收。
    • expungeStaleEntry方法會遍歷ThreadLocalMap的散列表,從當(dāng)前節(jié)點開始向后遍歷數(shù)組,將過期的條目(即key為null的條目)清理掉,并將這些條目的位置設(shè)置為null。如果遇到未過期的數(shù)據(jù),則重新計算其位置并重新分配,確保數(shù)據(jù)盡可能靠近正確的位置,以減少沖突和查找時間?。

編程習(xí)慣

在編程時,還需要注意:

  • 當(dāng)線程中某個ThreadLocal對象不再使用時,立即調(diào)用remove()方法刪除Entry對象。
  • 如果是在異常的場景中,應(yīng)在finally代碼塊中進行清理,保持良好的異常處理意識。

學(xué)得經(jīng)驗

  • 除了集中控制并發(fā)外,可以將競爭的數(shù)據(jù)分散出去。
  • 解決方案的自洽性,增加了線程自身的數(shù)據(jù)副本,需要保證生命周期的一致性,這里的設(shè)計盡最大可能的保證了GC的可執(zhí)行。
http://www.risenshineclean.com/news/51430.html

相關(guān)文章:

  • 開發(fā)網(wǎng)站設(shè)計百度競價推廣開戶價格
  • 網(wǎng)站建設(shè)方案 安全優(yōu)化營商環(huán)境心得體會2023
  • 做網(wǎng)站怎么讓百度收錄了高質(zhì)量外鏈代發(fā)
  • web程序設(shè)計與實踐做網(wǎng)站搜索引擎關(guān)鍵詞優(yōu)化技巧
  • 上海網(wǎng)站建設(shè)工作室微博推廣平臺
  • 四川住建廳官方網(wǎng)站的網(wǎng)址樂云seo
  • 武漢做網(wǎng)站的知名公司個人網(wǎng)頁怎么制作
  • 網(wǎng)站建設(shè)淺析昆明seo
  • 網(wǎng)站做百度推廣搜狐綜合小時報2022113011
  • 虛擬網(wǎng)站什么是搜索引擎營銷?
  • 網(wǎng)站建設(shè)哪家好 上海廣州疫情升級
  • 古典風(fēng)格網(wǎng)站模板htmlseo的搜索排名影響因素主要有
  • 天河做網(wǎng)站系統(tǒng)放單平臺
  • 南寧網(wǎng)站建設(shè)制作優(yōu)化大師哪個好
  • 手機英文網(wǎng)站大全各大搜索引擎入口
  • 企業(yè)管理模式馮宗耀seo教程
  • 做網(wǎng)站的總結(jié)游戲推廣員是做什么的
  • 網(wǎng)站運營和維護吉林seo刷關(guān)鍵詞排名優(yōu)化
  • 酷炫網(wǎng)站設(shè)計蘇州seo排名公司
  • 個人網(wǎng)站logo設(shè)計百度營銷推廣登錄
  • 陽谷做網(wǎng)站推廣石家莊關(guān)鍵詞優(yōu)化軟件
  • 株洲網(wǎng)站優(yōu)化找哪家網(wǎng)站模板哪家好
  • 做網(wǎng)站一直不知道做什么網(wǎng)站愛戰(zhàn)網(wǎng)關(guān)鍵詞挖掘查詢工具
  • 鹽城網(wǎng)站建設(shè)費用seo顧問服
  • 網(wǎng)站建設(shè) 策劃方案書1688官網(wǎng)
  • 朋友用我的vps做網(wǎng)站模板網(wǎng)站建站哪家好
  • 專注做一家男生最愛的網(wǎng)站百度代發(fā)排名
  • 常用h5的制作工具seo關(guān)鍵詞排名優(yōu)化方案
  • 今日頭條模板WordPress優(yōu)化深圳seo
  • b2b網(wǎng)站建立百度開放云平臺