目录

ThasBlog

学无止境

标签: 并发编程 (3)

Java AQS 有更新!

AQS AbstractQueuedSynchronizer, 队列同步器, 支持队列等待。 继承自 AbstractOwnableSynchronizer, 不带队列的同步器, 只能有一个线程同步, 其他线程忽略。 AQS 使用 state 和 一个 FIFO 队列来进行线程同步。 state 表示申请资源的状态, 默认 0, 若已被占用则小于 0. AQS 不关注申请和释放资源的方式, 只提供了操作 state 的方法。 在并发申请资源过程, AQS 维护各个线程获取资源的原则, 如不满足获取资源的条件, 则先将它们放入等待队列, 等待资源可以被申请了, 再唤醒等待队列中的线程。 申请和释放资源的方法需要锁自己实现: 1// 尝试申请资源 2boolean tryAcquire(int arg) 3// 尝试释放资源 4boolean tryRelease(int arg) 5// 资源是否被独占 6boolean isHeldExclusively() 7// 尝试以共享模式申请资源 8int tryAcquireShared(int arg) 9// 尝试以共....

Java JMM 有更新!

JVM 使用线程工作内存和主内存这两个概念来抽象物理内存结构, 从而屏蔽掉各平台各操作系统的内存结构差异。 JMM 为保障这套抽象内存结构的并发安全, 提供了协议和工具的支持。

Java8 ConcurrentHashMap 有更新!

ConcurrentHashMap 是 HashMap 的线程安全版本, 使用了 CAS, volatile 和 synchronize 技术。 初始化时使用 volatile 修饰的 sizeCtl 作为互斥条件, 如果有其他线程正在操作则 Thread.yeild(). 在插入元素时, 如果元素不存在, 则使用 CAS, 在插入新元素时, 如果元素不存在才能插入成功, 否则失败重试, 如果是 MOVED 状态, 则先辅助扩容, 完成后再尝试插入。 如果元素存在, 需要进行修改或者 Hash 冲突, 则加 synchronize 锁进行处理(因为情况比较复杂, 可能是链表, 可能还需要树化), synchronize 修饰 bin 上的第一个元素 元素数量修改时, 并发高的情况容易 CAS 失败, 引入 counterCells 数组减小 CAS 失败的概率 数组扩容时, 分段迁移, 每段最少 16, 迁移前 CAS 设置 transferIndex, 设置成功则得到该小段的迁移的权利。 迁移时, 如果该 bin 上有值, 则 synchronize 锁住, 如果无值, 则 CAS....