传统的方法 加Synchronized关键字,也就是所谓的加锁,只有拿到锁的线程才能操作该数据,这是所谓的让线程等待、牺牲时间的方法。

还有一种方法也能解决这个问题,Java中有一个ThreadLocal类 该类在源码中的描述为当前线程独有的一个存储类,可以在指定线程内存储数据。通过阅读源码之后发现有一个静态内部类ThreadLocalMap。该类为当前线程维护了一个数组Table(一个线程都拥有一个map,一个map维护一个Table),当前线程只能访问到属于自己的数组Table。 通过hashCode与length位运算确定出一个索引值i,这个i就是被存储在table数组中的位置(一个线程只有一个ThreadLocalMap,一个Map只有一个Table,但是一个Table可能有许多个ThreadLocal,通过算法确定ThreadLocal的索引)。这是牺牲空间换取时间的方法。

posted on 2020-06-19 17:15  Vinlen  阅读(1019)  评论(0编辑  收藏  举报