juc
neil677
只有不断进步,才能获得成功。
展开
-
独占锁和共享锁
多线程访问共享变量存在数据同时修改导致不一致问题,就需要锁来对共享数据的访问进行管理。 多个线程A B C 去竞争同一个锁L,存在线程获取锁的同步状态管理,排队获取锁,竞争获取锁,等待获取锁,释放锁唤醒其他等待中的线程问题。 Java中的synchronized关键字是一种锁的实现,隐式的管理多线程与锁的问题,由JVM实现。 JUC包下提供了显示锁来管理多线程和锁问题,Lock接口,...原创 2019-08-19 11:14:59 · 385 阅读 · 0 评论 -
重入锁 公平锁 非公平锁
重入锁 同一个线程可以多次获取同一个锁。synchronize关键字隐士的支持重入。JUC包下重入锁为ReentantLock,显示的提供来人锁重入功能,并且提供了获取锁的公平与非公平方式。 在时间上,先请求获取锁的线程一定能够先与其后的线程获取锁为公平锁,否则为非公平锁。公平锁减少了发生饥饿的概率,但是效率低。非公平锁则提升了TPS,缺会使饥饿问题概率提升。 重入的实现在于获取锁时,锁会保...原创 2019-08-19 11:15:13 · 143 阅读 · 0 评论 -
读写锁
ReentrantReadWriteLock提供读和写分离的锁机制 WriteLock ReadLock 当读线程获取锁时,允许其他线程获取锁,阻塞写线程。 当写线程获取锁时,阻塞所有其他线程。 读写都支持线程重入机制。 锁状态采用按位分割的方式表示读写状态和重入次数。 高16位表示读状态。在获取c == state之后,按位右移16位c>>>16获取读状态。读状态增加时,按位...原创 2019-08-19 11:15:29 · 123 阅读 · 0 评论 -
线程池
线程池 Executor框架 参数 任务等待队列 拒绝策略 coreSize 核心线程数 maxSize 最大线程数 https://www.jianshu.com/p/6c6f396fc88e newFixedThreadPool 定长的线程池,核心线程数和最大线程数相等,任务超出可用线程数会进入等待队列。 使用链表实现的阻塞队列,LinkedBlockingQueue,基于FIFO...原创 2019-08-16 17:06:54 · 165 阅读 · 0 评论 -
JUC包下并发容器
CopyOnWriteArrayList 内部实现为ReentrantLock作为锁实现操作互斥 Object[] 来存储数据 volatile修饰 保证可见性 对数组进行元素变化时,通过复制一个新的数组实现 开销比较大 该类的迭代器实现为 对原数组的快照进行操作 只能进行元素查询操作 不能进行元素修改操作 实现了List接口,作为列表使用。 实现了RandomAccess接口,支持快速随机索...原创 2019-08-20 11:40:01 · 360 阅读 · 0 评论 -
CAS和原子类
CAS 一种在操作系统层实现的并发算法。Java中的原子包大量使用了该算法来简化多线程编程。 当前内存值V 预期原值A 预期目标值B。当V==A时,将B赋值给变量,返回true,否则什么都不做,返false。 在Java中,通过UnSafe类对操作系统底层的CAS进行封装。以AtomicInteger为例子,对源码实现进行分析; public class AtomicInteger ex...原创 2019-08-19 11:15:37 · 196 阅读 · 0 评论 -
JUC锁小结
Lock接口定义用户调用规范。AQS实现锁,state表示同步状态,每个线程来获取该状态。 双向队列来保存等待中的线程。 阻塞、唤醒操作由LockSupport的park、unPark来实现。 Condition等待唤醒机制,维持一个睡眠状态的线程队列。 state 锁的同步状态 waitStatus等待队列状态 第一个线程过来获取锁时,直接获取成功。 ...原创 2019-08-19 11:15:45 · 241 阅读 · 0 评论