04 2021 档案
摘要:ThreadPoolExecutor: ctl:Integer原子变量,高3位表示线程池的状态,其他的位数用来记录线程池线程个数。 线程池状态:RUNNING:接受新任务并处理阻塞队列里的任务 SHUTDOWN:拒绝新任务并处理阻塞队列的任务 STOP:拒绝新任务并抛弃阻塞队列里的任务,同时会中断正
阅读全文
摘要:CAS实现非阻塞队列ConcurrentLinkedQueue: 维护一个无边界的单向链表。非阻塞的CAS,没有加锁而是多次循环去替代阻塞的消耗,会出现弱一致性的问题。 第一次执行Peek或first会把head指向队列真正的第一个元素。 节点head和tail是volatile的(可见性保证),只
阅读全文
摘要:接受请求后HttpServletRequest在doPost和doGet并将回应HttpServletResponse反馈给用户。 Servlet 可以设置初始化参数,供Servlet内部使用。 一个Servlet类只会有一个实例,在它初始化时调用init()方法,销毁时调用destroy()方法*
阅读全文
摘要:LockSupport工具类: 主要用于挂起和唤醒线程,是创建锁和其他同步类的基础。 每个使用LockSupport的线程会和他关联一个许可证。 主要功能由Unsafe类实现: 1.park():如果已经拿到了许可证,就返回。没有拿到就阻塞。不会抛异常。 2.unpark(Thread thread
阅读全文
摘要:CopyOnWriteArrayList: 是一个线程安全的ArrayList,对其的修改操作都是在底层的一个复制数组上进行的,也就是写时复制策略。 成员变量: Object数组 独占锁 方法: add set size isEmpty remove iterator 通过写时复制的方法来保证一致性
阅读全文
摘要:AtomicLong:主要进行一些自增自减和交换操作。原子性的前提下用的是非阻塞CAS的方法,比Synchronized效率高。但是高并发下仍会同时竞争一个原子变量。 但是java提供了一个更好用的LongAdder LongAdder: 维护一个几只基值变量base和一个Cell数组。Cell数组
阅读全文
摘要:JUC并发包的随机数生成器 弥补了Random类在多线程下的局限性。 局限性: Random生成随机数的机制是通过老种子计算出一个新的种子, 再通过新中子去计算随机数。 如果在多线程的情况下,虽然Random存在原子修饰符Atomic然后通过CAS避免多个线程共用一个老种子进行计算的情况。 但是这种
阅读全文
摘要:悲观锁:对外界修改数据保持悲观的态度(保守)。认为数据很容易被他的线程修改,所以在修改前加锁,在整个数据处理的过程中,对数据保持加锁的状态。 实现依靠数据库提供的锁,在数据记录操作前加排他锁。 如果获取锁失败说明数据正在修改,线程等待或抛出异常。 如果获取锁成功就对数据进行操作,然后提交事务后释放排
阅读全文
摘要:并发和并行: 并发是大时间段,并行是小时间段。 如果多个线程一起访问共享资源,至少一个线程进行修改操作,会出现线程安全问题。 JAVA内存模型知识: 当一个线程操作共享变量时,它首先从主内存复制共享变量到自己的工作内存中,然后在工作内存对变量进行修改,处理完后将变量的值更新到主内存中去。 例如这种C
阅读全文
摘要:线程中断: java的中断并不是真正的通断,是一种线程协作机制,设置线程的中断标志,然后交给线程根据中断的状态自行处理 interrupt:中断线程,当调用线程的interrupt仅仅是设置了中断标志,如果线程使用了wait,join,sleep会被阻塞挂起 interrupted:判断是否被中断,
阅读全文
摘要:Join:t.join()方法只会使主线程(或者说调用t.join()的线程)进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。 即:优先执行t,执行完毕后再往下执行。 参考文献:https://blog.csdn.net/u013425438/article/de
阅读全文