java 多线程库_Java多线程设计模式(7)线程独有储藏库模式
一 ?Thread-Specific Storage Pattern
Thread-Specific Storage Pattern指的就是線程獨有的儲藏庫,針對每個線程提供內存空間的意義。這種模式只有一個入口,但是內部會對每個線程提供特有的存儲空間。
Thread-Specific Storage Pattern的所有參與者:
1,Client參與者,提出具體工作的,將該具體工作委托給TSObjectProxy參與者。
2,TSObjectProxy參與者,這個主要是接受工作請求的,它會處理多個Client的工作,它一般都包括了TSObjectCollection。一般都是先使用TSObjectCollection參與者,取得Client參與者所對應的TSObject參與者,并將Client具體的工作委托給TSObject參與者。
3,TSObjectCollection參與者,這個主要就是線程獨有對象的集合,它利用線程鍵值對來存儲著執行Client參與者線程所對應的TSObject參與者。一般都是利用ThreadLocal來實現。
4,TSObject參與者,線程獨有的對象,存放著線程特有的信息,盡管會為多個線程使用,但是不需要利用synchronized來進行互斥操作。
TSObject參與者與TSObjectProxy參與者具有相同的接口。
具體的模式如下圖所示。雖然多個不同的ClientThread來請求同一個對象Log即TSObjectProxy參與者,但是Log會為每個請求線程利用ThreadLocal來分配獨立的TSLog對象。所有線程所共享的是TSObjectProxy參與者。
關于ThreadLocal小講:
每一個線程都擁有自己獨立的存儲空間,也就是方法局部變量的堆棧,在方法里分配的局部變量都是線程所獨有的,但是這些變量一退出方法就會消失了。ThreadLocal則是與方法調用無關,它為線程分配特有空間。
ThreadLocal實例如一個保管箱間,它通過線程鍵值對來存儲與線程特定的信息。每個線程的保管箱,都放置在ThreadLocal中。
ThreadLocal該類提供了線程局部變量。ThreadLocal的局部變量在被多個線程使用時候,每個線程只能拿到該變量的一個副本。
在ThreadLocal類型的變量內部有個ThreadLocalMap,它提供了一個注冊表來注冊與當前線程相關的信息,ThreadLocal類型的變量對外部表現是一個,但是內部確實管理著一群對象的集合。
在利用get與set的時候,都會在兩個方法體中首先獲取Thread t = Thread.currentThread();,然后在該線程的內部進行操作。不用擔心其他線程對于該線程的破壞訪問。在使用兩個方法的時候務必要分清是屬于那個線程中的操作。
在這個模式中,客戶端線程所共享的是TSObjectProxy參與者,但是實際的工作則是在TSObject參與者分配給相應的線程后才進行的,就是利用TSObjectProxy參與者來分配不被共享的TSObject參與者。對于TSObject完全不用做任何的互斥synchronized操作。
代碼示例:
僅僅列出TSObjectProxy的架構模式
Log代表了TSObjectProxy參與者,供多個線程進行訪問,最后將具體的操作委托給TSObject
package whut.specificstorage;
//負責產生保管箱間的類
public class Log {
//首先利用static final修飾
//保證了所有訪問該類的線程都只使用一個唯一的且不變的保管箱間。
private static final ThreadLocal tsLogCollections=new ThreadLocal();
//不用使用synchronized,因為在使用get和set時候,會字段判別當前所屬的線程
//取得當前線程特有的Log
private static TSLog getTSLog()
{
TSLog tsLog=(TSLog)tsLogCollections.get();
//如果線程是第一次調用,就建立新文件夾以及注冊log
if(tsLog==null)
{
tsLog=new TSLog(Thread.currentThread().getName()+"-log.txt");
tsLogCollections.set(tsLog);
}
return tsLog;
}
//加入一條LOG
public static void println(String s)
{
getTSLog().println(s);
}
//關閉LOG
public static void close()
{
getTSLog().close();
}
}
該Log類具有TSobject相同的方法,客戶端線程每次請求該類,進而為請求的線程分配屬于該線程的TSObject對象,每次的工作都是最終委托給TSObject來真正的執行。TSObjectProxy和TSObject類的方法與字段不需要進行任何的synchronized處理。
總結
以上是生活随笔為你收集整理的java 多线程库_Java多线程设计模式(7)线程独有储藏库模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eog——Eye of GNOME Im
- 下一篇: 用计算机解决质数猜想,天才数学家又出成果