synchronized是實現java的同步機制。同步機制是爲了實現同步多線程對相同資源的併發訪問控制。保證多線程之間的通訊。 同步的主要目的是保證多線程間的數據共享。同步會帶來巨大的性能開銷,因此同步操做應該是細粒度的。若是同步使用得當,帶來的性能開銷是微不足道的。使用同步真正的風險是複雜性和可能破壞資源安全,而不是性能。
ThreadLocal是採用哈希表的方式來爲每一個線程都提供一個變量的副本。
Synchronized仍是ThreadLocal?
ThreadLocal以空間換取時間,提供了一種很是簡便的多線程實現方式。由於多個線程併發訪問無需進行等待,因此使用ThreadLocal會得到更大的性能。雖然使用ThreadLocal會帶來更多的內存開銷,但這點開銷是微不足道的。由於保存在ThreadLocal中的對象,一般都是比較小的對象。另外使用ThreadLocal不能使用原子類型,只能使用Object類型。ThreadLocal的使用比synchronized要簡單得多。
ThreadLocal和Synchonized都用於解決多線程併發訪問。可是ThreadLocal與synchronized有本質的區別。synchronized是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程訪問。而ThreadLocal爲每個線程都提供了變量的副本,使得每一個線程在某一時間訪問到的並非同一個對象,這樣就隔離了多個線程對數據的數據共享。而Synchronized卻正好相反,它用於在多個線程間通訊時可以得到數據共享。
Synchronized用於線程間的數據共享,而ThreadLocal則用於線程間的數據隔離。
固然ThreadLocal並不能替代synchronized,它們處理不一樣的問題域。Synchronized用於實現同步機制,比ThreadLocal更加複雜。
java