線程特有對(duì)象
我們可以選擇不共享非線程安全的對(duì)象,對(duì)于非線程安全的對(duì)象,每個(gè)線程都創(chuàng)建一個(gè)該對(duì)象的實(shí)例,各個(gè)線程線程訪問(wèn)各自創(chuàng)建的實(shí)例,一個(gè)線程不能訪問(wèn)另外一個(gè)線程創(chuàng)建的實(shí)例. 這種各個(gè)線程創(chuàng)建各自的實(shí)例,一個(gè)實(shí)例只能被一個(gè)線程訪問(wèn)的對(duì)象就稱為線程特有對(duì)象. 線程特有對(duì)象既保障了對(duì)非線程安全對(duì)象的訪問(wèn)的線程安全,又避免了鎖的開(kāi)銷.線程特有對(duì)象也具有固有的線程安全性。
ThreadLocal類相當(dāng)于線程訪問(wèn)其特有對(duì)象的代理,即各個(gè)線程通過(guò)ThreadLocal對(duì)象可以創(chuàng)建并訪問(wèn)各自的線程特有對(duì)象,泛型T指定了線程特有對(duì)象的類型. 一個(gè)線程可以使用不同的ThreadLocal實(shí)例來(lái)創(chuàng)建并訪問(wèn)不同的線程特有對(duì)象。
ThreadLocal實(shí)例為每個(gè)訪問(wèn)它的線程都關(guān)聯(lián)了一個(gè)該線程特有的對(duì)象, ThreadLocal實(shí)例都有當(dāng)前線程與特有實(shí)例之間的一個(gè)關(guān)聯(lián)。
裝飾器模式可以用來(lái)實(shí)現(xiàn)線程安全,基本思想是為非線程安全的對(duì)象創(chuàng)建一個(gè)相應(yīng)的線程安全的外包裝對(duì)象,客戶端代碼不直接訪問(wèn)非線程安全的對(duì)象而是訪問(wèn)它的外包裝對(duì)象. 外包裝對(duì)象與非線程安全的對(duì)象具有相同的接口,即外包裝對(duì)象的使用方式與非線程安全對(duì)象的使用方式相同,而外包裝對(duì)象內(nèi)部通常會(huì)借助鎖,以線程安全的方式調(diào)用相應(yīng)的非線程安全對(duì)象的方法。
在java.util.Collections工具類中提供了一組synchronizedXXX(xxx)可以把不是線程安全的xxx集合轉(zhuǎn)換為線程安全的集合,它就是采用了這種裝飾器模式. 這個(gè)方法返回值就是指定集合的外包裝對(duì)象.這類集合又稱為同步集合。
使用裝飾器模式的一個(gè)好處就是實(shí)現(xiàn)關(guān)注點(diǎn)分離,在這種設(shè)計(jì)中,實(shí)現(xiàn)同一組功能的對(duì)象的兩個(gè)版本:非線程安全的對(duì)象與線程安全的對(duì)象. 對(duì)于非線程安全的在設(shè)計(jì)時(shí)只關(guān)注要實(shí)現(xiàn)的功能,對(duì)于線程安全的版本只關(guān)注線程安全性。