
并发编程
xyfaneast
Java开发爱好者
展开
-
深入浅出Java多线程-第十章 CAS与原子操作-学习
CAS的全称是:比较并交换(Compare And Swap)。在CAS中,有这样三个值:V:要更新的变量(var)E:预期值(expected)N:新值(new)比较并交换的过程如下:判断V是否等于E,如果等于,将V的值设置为N;如果不等,说明已经有其它线程更新了V,则当前线程放弃更新,什么都不做。所以这里的预期值E本质上指的是“旧值”。CAS实现原子操作的三大问题ABA问题:...原创 2020-04-05 22:36:06 · 103 阅读 · 0 评论 -
分布式锁的实现
分布式服务需要一个全局锁来实现同一个模块多个服务之间的同步。就需要用到分布式锁。实现方式:数据库主键、redis、zookeeper1、数据库利用数据库主键唯一规则,在争抢锁的时候向DB中写一条记录,这条记录主要包含锁的id、当前占用锁的线程名、重入的次数和创建时间等,如果插入成功表示当前线程获取到了锁,如果插入失败那么证明锁被其他人占用,等待一会儿继续争抢,直到争抢到或者超时为止。...原创 2020-04-05 21:30:24 · 89 阅读 · 0 评论 -
ThreadpoolExecutor任务调度执行过程
ThreadpoolExecutor任务调度执行过程:1.当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。2.当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行3.当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线...原创 2020-04-05 21:31:15 · 554 阅读 · 0 评论 -
多线程使用注意
1、永远不要在循环之外调用wait方法原因:尽管不满足被唤醒条件,但是由于其他线程调用notifyAll()方法会导致被阻塞线程意外唤醒,此时执行条件并不满足,他将破坏被锁保护的约定关系,导致约束时效,引起意想不到的结果。一般用while循环2、唤醒线程是应该用 notify()还是notifyAll()当你不知道究竟该调用哪个方法时,保守的做法是调用notifyAll()唤醒所有等...原创 2020-04-05 21:29:19 · 191 阅读 · 0 评论 -
java内存模型
为了控制线程之间的通信,(完成底层封装) 用来屏蔽掉各种硬件和操作系统之间的内存访问差异,以实现让Java程序在各平台下都能达到一致的内存访问效果。JMM目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节(这里变量指代的是实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,后者是线程私有的,不会被共享) 学习J...原创 2020-04-05 21:27:20 · 79 阅读 · 0 评论