JUC ThreadLocal

ThreadLocal从其命名上就可以知道其意图是创建线程本地变量,就是希望同一个变量在不同的线程中拥有各自的值并且互不影响,其非常适合用来作为线程上下文变量,比如在一些连接池或者事务的场景中。

其思路是让每个Thread都持有一个私有的ThreadLocalMap,然后使用共享的key来保存值,而这个key就是共享的ThreadLocal实例,因此每个ThreadLocal也就对应一个本地变量。。但是,如果这个本地变量本身就是一个线程共享的对象,那么就算使用ThreadLocal也不是线程安全的。另外,设计者将具体的map操作都封装在了ThreadLocal中,然后提供统一的get/set接口,好让开发更加简洁方便。

Java Map

java容器中一般最常用的就是List、Set、Map,List的实现前面已经介绍过,本文主要讨论下Map的几个实现,至于Set则比较简单,它们仅仅是依赖Map做了层封装而已。

在讨论之前,还是先看下Map的继承结构


Java List

根据实现的接口可以将java容器分为Collection和Map两部分,其中还可以按照是否线程安全来继续划分,大部分线程安全的实现在JDK1.5之后新增的concurrent包中。

本文先讨论Collection中比较基础的两个List实现ArrayListLinkedList,前者通过数组,后者通过链表。数组的好处在于有位置索引,可以按下标任意访问,并且由于数组在内存上的连续性,因此访问会更快,但前提是元素必须排列紧凑, 这样在进行插入删除时就免不了要进行移动,而且由于数组长度不可变,在添加元素时可能需要扩容和复制处理。链表可以弥补数组在插入删除上的缺陷,但代价是牺牲查询的效率,尤其是按位置索引访问时,它只能选择从头或者从尾开始依次遍历。

在讨论之前先整体看下Collection的体系结构,可以看到其实有很多的实现类,它们分别用来应付各种不同的场景


Centos 配置yum离线源

在项目开发部署过程中,一般都是内网环境,无法在线安装一些软件,这时候就需要我们配置离线的yum源。

centos版本:7.9.2009