1.并发编程
文章平均质量分 86
Java深入——并发编程
清梦之灵
这个作者很懒,什么都没留下…
展开
-
二、并发容器
并发容器1.时间复杂度1.1 什么是大O1.2 常见的时间复杂度量级O(1)O(n)O(n2)O(logn)O(nlogn)2.HashMap源码分析3.ConcurrentHashMap3.1 JDK1.7中原理和实现ConcurrentHashMap中的数据结构初始化做了什么事?构造方法中部分代码解惑在get和put操作中,是如何快速定位元素放在哪个位置的?get()方法put()方法扩容操作size方法弱一致性3.2 JDK1.8中原理和实现与1.7相比的重大变化主要数据结构和关键变量初始化做了什么事原创 2020-10-26 21:45:31 · 192 阅读 · 0 评论 -
四、类的线程安全
类的线程安全1.怎么才能做到类的线程安全?1.1 栈封闭1.2 无状态1.3 让类不可变1.4 volatile1.5 加锁和CAS1.6 安全的发布1.7 ThreadLocal2 死锁2.1 静态死锁2.2 动态死锁2.3 线程饥饿3.锁性能思考3.1 缩小锁的范围3.2 减少锁的粒度1.怎么才能做到类的线程安全?1.1 栈封闭所有的变量都是在方法内部声明的,这些变量都处于栈封闭状态。public class Safe{ public int service(){ int a = 1原创 2020-10-26 21:25:58 · 450 阅读 · 1 评论 -
三、阻塞队列与线程池应用
阻塞队列与线程池补充1.LinkedTransferQueue2.LinkedBlockingDeque3.自定义线程池4.合理配置线程池5.ScheduledThreadPoolExecutor6.ComletionService1.LinkedTransferQueue一个由链表结构组成的无界阻塞队列。transfer(),必须要消费者消费了以后方法才会返回, tryTransfer()无论消费者是否接收,方法都立即返回。2.LinkedBlockingDeque一个由链表结构组成的双向阻原创 2020-10-26 21:24:45 · 217 阅读 · 0 评论 -
二、位运算Hash
位运算与Hash1.位运算1.1 补码、原码、反码1.2 为什么计算机系统中,数字用补码表示1.3 位运算使用1.4 位运算的常用小技巧1.4.1 判断奇偶数1.4.2 权限系统设计2. a % 2 n = a & (2 n - 1)3.Hash4.多线程下HashMap为什么线程不安全?4.1 put数据丢失4.2 扩容死循环1.位运算1.1 补码、原码、反码1.在计算机系统中,数字一律用补码表示、运算和存储。原码:原码表示法在数字前面增加了一位符号位,即最高位为符号位,正数位该位为0原创 2020-10-25 18:10:54 · 801 阅读 · 0 评论 -
一、多线程基础补充
多线程基础补充1.并行与并发2.怎么样才能让Java里的线程安全停止工作呢3.Thread的中断机制中断线程判断线程是否被中断如何中断线程底层中断异常处理方式中断应用使用中断信号量中断非阻塞状态的线程使用thread.interrupt()中断非阻塞状态线程使用thread.interrupt()中断阻塞状态线程4.等待/通知的标准范式5.等待超时模式的数据库连接池(wait/notify)6.Fork/join6.1 Fork/join介绍6.2 Fork/Join框架的实现原理:6.3 使用场景:6.4原创 2020-10-25 11:54:35 · 99 阅读 · 0 评论 -
八、线程池原理
线程池原理1.Executors的缺陷2.Executor 接口:3.ExecutorService接口4.FutureTask5.AbstractExecutorService5.ThreadPoolExecutor1.Executors的缺陷可以通过Executors静态工厂构建线程池,但一般不建议这样做Executors创建线程池可能会导致OOM(OutOfMemory ,内存溢出)在阿里巴巴Java开发手册中也明确指出,而且用的词是『不允许』使用Executors创建线程池。newFix原创 2020-10-23 15:44:17 · 105 阅读 · 0 评论 -
七、AQS原理篇
原理篇1.AQS (AbstractQueuedSynchronizer)1.1 AQS产生背景2 AQS设计和结构2.1 AQS设计思想2.2 同步状态2.3 阻塞2.4 队列2.5 条件队列3 AQS源代码实现3.1 独占式同步状态的获取和释放3.1.1 独占锁的获取3.1.2 独占锁的释放3.2 共享锁的获取和释放3.2.1 共享锁的释放3.2.2 共享锁的获取3.3 中断3.4 超时4 本节问题4.1 上节问题解答4.2 本节问题1.AQS (AbstractQueuedSynchronizer)原创 2020-10-22 21:19:30 · 246 阅读 · 0 评论 -
六、锁的深入化
锁的深入化1.锁的分类1.1 公平锁/非公平锁1.1.1 公平锁1.1.2 非公平锁1.2 可重入锁/不可重入锁1.2.1 可重入锁1.2.2 不可重入锁1.3 独享锁/共享锁1.3.1 独享锁1.3.2 共享锁1.4 互斥锁/读写锁1.4.1 互斥锁1.4.2 读写锁1.5 乐观锁/悲观锁1.5.1 悲观锁1.5.2 乐观锁1.6 分段锁1.7 偏向锁/轻量级锁/重量级锁1.7.1 偏向锁1.7.2 轻量级锁1.7.3 重量级锁1.8 自旋锁1.8.1 CAS: 无锁的执行者:Compare And Sw原创 2020-10-21 21:48:43 · 166 阅读 · 0 评论 -
五、Callable与Future模式
Callable与Future模式1.介绍2.Future3.Future模式4.JDK中的Future模式1.介绍创建线程的2种方式:继承Thread,实现Runnable接口,这两种方式都有一个缺陷就是:在执行完任务之后,无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式达到效果。Callable位于java.util.concurrent包下:public interface Callable<V>{ V calls throws Excep原创 2020-10-20 13:45:36 · 115 阅读 · 0 评论 -
四、并发包工具与线程池
并发包工具与线程池1.并发包1.1 计数器:CountDownLatch1.2 CyclicBarrier屏障1.3 计数信号量 Semaphore2 阻塞队列 BlockingQueue2.1 介绍2.2 ArrayBlockingQueue2.2 LinkedBlockingQueue2.3 DelayQueue2.3.1 业务场景一:多考生考试2.3.2 业务场景二:具有过期时间的缓存2.4 优先队列 PriorityBlockingQueue2.5 同步队列:SynchronousQueue3 阻塞原创 2020-10-19 14:19:03 · 307 阅读 · 2 评论 -
三、多线程通讯
多线程通讯1.生产者-消费者模型1.1 示例1.2 wait、notify、notifyAll方法2.wait、notify常见问题2.1 丢失的信号2.2 假唤醒2.3 while循环其他场景:多个线程等待相同信号2.4 不要在字符串常量或全局对象中调用wait()2.5 wait、sleep、yeild方法的区别3 Lock锁3.1 synchronized与Lock对比3.1 lock():3.2 tryLock() & tryLock(long time, TimeUnit unit)3.3原创 2020-10-16 10:42:48 · 119 阅读 · 0 评论 -
二、多线程安全
多线程安全1.多线程安全问题2.synchronized使用及原理2.1 synchronized 使用2.2 synchronized 原理3.多线程死4.多线程运行状态(生命周期)5.用户线程与守护线程(User与Daemon)6.Join方法7.线程的优先级8.yield()方法1.多线程安全问题当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题,但是做读操作是不会发生数据冲突问题。经典实例:两个窗口同时出售100张票public class原创 2020-10-14 18:44:32 · 588 阅读 · 2 评论 -
一、多线程基础
多线程基础1.线程和进程2.多线程应用场景:提高程序效率3.多线程创建方式4.多线程运行状态(生命周期)5.用户线程与守护线程(User与Daemon)6.Join方法7.线程的优先级8.yield()方法1.线程和进程1)进程:计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。2)线程:操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。2.多线程应用场景:提高程序效率3.多线程创建方式1)第一种方式:继承class T1 → Th原创 2020-10-13 18:06:11 · 88 阅读 · 0 评论