常用集合源码
2020-08-05 14:01:19 17 举报
集合
作者其他创作
大纲/内容
countDownLatch内部类Sync重写了AQS中这个方法
false
当前map是否为null
主要作用是隔离线程,tl中保存的数据只属于当前线程。存放在堆上。栈中方法弹栈后变量会被回收。场景:spring事务隔离级别的实现是通过tl来保证单个线程操作数据库时使用的是同一个连接。
CyclicBarrier
在init()中如果当前线程和父线程的itl都存在,父线程的itl会传递给子线程的itl。
判断初始数组是否为空
首先判断size+1长度能不能在数组中放的下ensureCapacityInternal(size + 1)
获取锁失败
DEFAULT_CAPACITY = 10Object[] elementData
原理:允许一组线程相互等待,直到到达摸一个公共屏障点,统计文件行数,所有线程统计完成后加一个总和
Entry
三个内部类SynFairSynNonFairSyn
数组容量检查
设置值后在tl.remove()前是可以取出数据的,remove()之后别的线程拿不到这个值,数据隔离的实质是thread类中维护了一个tlm对象
内部类Sync继承自AQS
ThreadLocal 对象有一个创建时生成唯一的 Id,存取时用到的hash值不是ThreadLocal的hash值它的存取是从0开始的AtomicInteger 通过getAndAdd HASH_INCREMENT 来生成
调用tryAcquireShared(arg)方法获得共享锁 >0?
acquire()
1.5倍扩容使用Arrays.copy()完成旧元素到新数组中的转移
每一个tl都有自己的tlhashcode,根据,key.tlhc&(len-1)确定存储位置,当前位置为空就初始化一个Entry,如果key相等就刷新value,发生hash冲突就去找下一个空位置
调用该方法,执行附加指令后,通知其他所有线程使用的是condition.signalAll()
dowait()方法中判断当前线程是不是最后一个线程?
release()中调用releaseShared()又调用了tryRealease()对state做增量操作
构造方法中可以指定初始容量大小,也可以空参默认容量是10
state == 0
调用doAcquireSharedInterruptibly()将当前线程加入等待队列
ThreadLocal
扩容后长度还小于minCapacity,容量扩充为minCapacity
问题:1.会存在内存泄漏。因为tl在Entry中继承自弱引用,tl引用一直存在会导致value得不到回收,也无法通过tl来找到这个值(tl被GC回收)解决方案:代码最后执行remove() 2. 当线程返回到线程池时,这个对象的状态还在,这个线程再来处理其他任务的时候影响正常的业务逻辑
扩容有两种情况,数组长度为0,第一次add时扩容数组长度小于当前minCapacity触发扩容
公平锁和非公平锁各自重写了获取锁的tryAcquireShared()方法,而释放锁的tryRealease()是一致的在父类Syn中实现
get()方法获得当前线程t,拿到t的ThreadLocals对象
给数组一个默认值10
Thread类中还有一个inheritableThreadLocals 。如果父类的inheritableThreadLocals指定过,该父进程的子进程就会继承该变量
releaseShared()
递减state的值
true
最小长度大于缓冲区当前长度执行扩容grow()
如果不是最后一个到位线程就一直循环等待,使用的是condition.await()。直到收到唤醒信号
Semaphore
ArrayList
核心:通过一个内部类ThreadLocalMap维护了一个类似于HashMap的数据结构
set(T value)首先获得当前线程t,然后拿到当前线程的ThreadLocalMap对象
上一步执行成功执行releaseShared()唤醒后继线程
第一次add()时初始化数组容量
CountDownLatch
核心原理:利用了AQS共享锁通过递减state值来实现闭锁的控制,常用于一个线程等待多个线程执行完才继续执行的场景,班长和6个同学上自习,6个同学离开后班长才能离开。
和AQS排它锁中的acquireQueued()相似
获取到entry中的value
value
Thread
state ==0
tlm没有实现map接口,但是它的内部类Entry(封装了tl,value)继承了了weakReference,也没有next指针,不存在链表结构。有一个Entry数组,因为一个线程可以有多个tl来存放不同值。
await()的tryAcquireshared()
通过map.getEntry()获取到threadLocal对应的对象entry
countDown()
以当前ThreadLocal为key,value为值存入map中
和Thread的区别:Thread类的threadLocals引用了ThreadLocal.ThreadLocalMap。这个map由ThreadLocal维护
ThreadLocalMap
获取锁成功
执行释放共享锁的操作
add(E e)
核心原理:利用AQS共享锁通过递减AQS的state值控制同一时间能访问共享资源的线程个数,停车场6辆车抢三个车位
非公平锁中调用了nonfairTryAcquireShared()和非公平锁相比删除了对同步队列的判断即hasQueuedPredecessors()
minCapacity
内部类Generation的broken默认barrier没有被损坏成员变量有一个ReentrantLocklock对象和拦截线程的数量
0 条评论
下一页