threadlocal和线程同步机制的比较

来源:互联网 发布:怎样参加淘宝天天特价 编辑:程序博客网 时间:2024/05/14 23:58
          threadLocal和其他所有的同步机制都是为了解决多线程中的对同一变量的访问冲突。

         在普通的同步机制中,是通过对象加锁来实现多个线程对统一变量的安全访问的,这时该变量是多个线程共享的,使用这种同步机制需要很细致的分析在什么时候对变量进行读写、什么时候需要锁定某个对象,什么时候释放该对象的锁等等。同步机制中一般使用synchronized关键字来保证同一时刻只有一个线程对共享变量进行操作。但在有些情况下,synchronized不能保证多线程对共享变量的正确读写。例如类有一个类变量,该类变量会被多个类方法读写,当多线程操作该类的实例对象时,如果线程对类变量有读取、写入操作就会发生类变量读写错误,即便是在类方法前加上synchronized也无效,因为同一个线程在两次调用方法之间时锁是被释放的,这时其它线程可以访问对象的类方法,读取或修改类变量。   这种情况下可以将类变量放到ThreadLocal类型的对象中,使变量在每个线程中都有独立拷贝,不会出现一个线程读取变量时而被另一个线程修改的现象。

         Threadlocal从另一个角度来解决多线程的并发访问,threadlocal为每一个线程维护一个和该线程绑定的变量的副本,使每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。threadlocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的整个变量封装进threadlocal,或者把该对象的特定的线程的状态封装进threadlocal

         ThreadLocal并不能替代同步机制,两者面向的问题领域不同。

         同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信的有效方式;

         而threadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享变量,这样当然不需要对多个线程进行同步了。

         所以,如果需要进行多个线程之间进行通信,则使用同步机制;如果需要隔离多个线程之间的共享冲突,可以使用threadLocal。这将极大的简化程序,使程序更加易读、简洁。

         对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

        ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。