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