![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 56
我想砍你
这个作者很懒,什么都没留下…
展开
-
十七、模拟Future
package day10.part2;/** * Future模式 * 模拟一个在没有锅和食材的情况下要进行烹饪的过程 * * 1、Future代表:一个异步调用的未来的凭证,在做完其它事情之后 相当于JDK中的Future接口 * 再往下必须要返回结果时可以拿着这个凭证去进行get我们想要的返回结果 * 2、FutureTask代表:将调用逻辑和返回结果进行隔离 相当于JDK中的Callable接口 * 3、FutureService:是桥接Future和FutureT.原创 2021-01-18 18:21:11 · 87 阅读 · 0 评论 -
十六、Callable、Future
1、先说明启动线程的两种方式:1.继承Thread类方式/** * 通过继承Thread类方式来创建线程 */public class CreateThread01 extends Thread { @Override public void run() { System.out.println("通过继承Thread类方式来创建线程"); } public static void main(String[] args) { Cr原创 2021-01-18 17:41:41 · 165 阅读 · 1 评论 -
十三、ThreadPoolExecutor介绍
| 参数名| 参数含义 ||-corePoolSize-|核心线程数|| maxinumPoolSize| 最大线程数 |原创 2021-01-13 20:22:29 · 115 阅读 · 0 评论 -
十五、多线程开发规范
以下是线程以及线程池在开发中的规范原创 2021-01-14 09:54:41 · 214 阅读 · 0 评论 -
十四、ThreadPoolExecutor线程池的拒绝策略
四种拒绝策略如下 * 往线程池中扔4个任务 核心线程数是1 最大线程数是2 队列大小是1 * 仍第一个任务时 先放入阻塞队列,开启一条线程获取该任务执行 * 仍第二个任务时 放入阻塞队列 * 仍第三个任务时 发现核心线程还没有执行完,那新创建线程拿走任务二 并将任务三放入阻塞队列 * 仍第二个任务时 最大线程已满而且还没有执行完,阻塞队列已满 走拒绝策略代码如下:package day10.part2;import java.util.con原创 2021-01-13 20:11:31 · 255 阅读 · 0 评论 -
十二、偏向锁、轻量级锁、重量级锁,锁的膨胀过程
1、对象的状态有几种:无锁、偏向锁、轻量级锁、重量级锁、GC标记,共5个状态2、锁的膨胀过程无锁:程序多线程执行过程中没有去执行synchronized修饰区域或者方法。偏向锁:发生在程序单线程执行过程中,由始至终只有一个线程去执行过synchronized修饰区域或者方法,由于是由始至终只有一个线程去执行所以没有发生竞争、等待、抢锁的情况,它不会调用操作系统的函数去实现同步。轻量级锁:发生在程序多线程执行过程中有去执行synchronized修饰区域或者方法,且没有发生竞争、等待、抢锁的情况或原创 2021-01-11 20:01:02 · 258 阅读 · 0 评论 -
十一、synchronized、volatile、AtomicInteger三者对比和总结
1、synchronized加了synchronized,每次都从主存中去读取数据,这样就能读取到新数据了。但是一加锁,每次只能有一个线程访问,当一个线程持有锁时,其他的就会阻塞,效率就非常低了。不想加锁,又要解决内存可见性问题,那么就可以使用volatile关键字。2、volatile当一个共享变量被volatile修饰时,它会保证修改的值除了存储进自己缓存中,还会立即被更新到主存,并将其他线程中该变量的引用置为无效,当有其他线程需要使用该变量时,它会先检查该变量是否还有效,如果无效则去内存中读取新原创 2021-01-08 12:11:12 · 271 阅读 · 0 评论 -
十、Atomic和ABA问题
1、原子类AtomicInteger的API讲解package day05.part1;import java.util.concurrent.atomic.AtomicInteger;/** * 原子类AtomicInteger的API讲解 * @author xzq */public class AtomicTest01 { public static void main(String[] args) { /* *空参数 默认为0原创 2021-01-07 20:53:05 · 372 阅读 · 0 评论 -
九、Exchanger 线程间数据交换工具
1、可以实现一对线程间数据交换,只能是一对线程之间package day04.part1;import java.util.concurrent.Exchanger;/** * 线程间数据交换工具 * 可以实现一对线程间数据交换,只能是一对线程之间 * @author xzq */public class ExchangerTest01 { public static void main(String[] args) { final Exchanger<S原创 2021-01-06 19:38:09 · 177 阅读 · 0 评论 -
八、Semaphore 信号灯介绍
1、Semaphore 是什么Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。可以把它简单的理解成我们停车场入口立着的那个显示屏,每有一辆车进入停车场显示屏就会显示剩余车位减1,每有一辆车从停车场出去,显示屏上显示的剩余车辆就会加1,当显示屏上的剩余车位为0时,停车场入口的栏杆就不会再打开,车辆就无法进入停车场了,直到有一辆车从停车场出去为止。2、使用场景朱勇用于那些资源有明确访问数量限制的场景,常用于限流 。比如:数据库连原创 2021-01-06 19:32:22 · 157 阅读 · 0 评论 -
七、CountDownLatch和CyclicBarrier案例以及区别
CyclicBarrier和CountDownLatch 都位于java.util.concurrent 这个包下总结:CountDownLatch 主要用来解决一个线程等待多个线程的场景,可以类比旅游团团长要等待所有游客到齐才能去下一个景点。而 CyclicBarrier 是一组线程之间的相互等待,可以类比几个驴友之间的不离不弃,共同到达某个地方,再继续出发,这样反复。1、CountDownLatch实现并行处理最后汇总结果的功能package day03.part3;import jav原创 2021-01-05 20:38:48 · 122 阅读 · 0 评论 -
六、LockSupport
1、为什么使用LockSupport类如果只是LockSupport在使用起来比Object的wait/notify简单,那还真没必要专门讲解下LockSupport。最主要的是灵活性。①LockSupport不需要在同步代码块里 。所以线程间也不需要维护一个共享的同步对象了,实现了线程间的解耦。②unpark函数可以先于park调用,所以不需要担心线程间的执行的先后顺序。上边的例子代码中,主线程调用了Thread.sleep(1000)方法来等待线程A计算完成进入wait状态。如果去掉Threa原创 2021-01-05 20:19:47 · 168 阅读 · 1 评论 -
五、读写锁-ReentrantReadWriteLock
这里介绍读写锁的演变1、使用synchronized来控制读写使用synchronized 对修改、删除、添加操作加锁,对查询操作不加锁时就会产生脏读。如下代码,对写加synchronized 读不加package deadlock;/** * 演示脏读 * 对修改、删除、添加操作加锁, * 对查询操作不加锁时就会产生脏读 * 写的过程中 不能查看 要互斥 * @author xzq */public class DirtyRead { static class Perso原创 2021-01-05 18:18:11 · 143 阅读 · 0 评论 -
四、synchronized、nodify的bug案例
1、生产者消费者模式使用nodify的弊端-死锁该实例中消费者吃完了后本来是唤醒生产者生产油条 但把另一个消费者唤醒了,然后被唤醒的消费者开始吃 发现没有了就开始wait而此时生产者并没有被唤醒也在wait 就导致大家都在wait 导致死锁下面代码为死锁情况package ProducerAndConsumer;/** * 死锁了 * 生产者消费者模式使用nodify的弊端: * 有可能会唤醒本类的线程即: * 在多生产这多消费者的时候会出现 * 消费者唤醒消费者,生产者唤醒生产者而的情原创 2021-01-05 16:48:01 · 321 阅读 · 0 评论 -
三、线程间的通信
下面程序会有什么问题package examination;import java.util.ArrayList;import java.util.List;/** * taobao examination * 实现一个容器,提供两个方法,add和size * 写两个线程,线程1添加10个元素到容器中, * 线程2实现监控元素的个数,当个数到5个时, * 线程2给出提示并结束 * @author xzq */public class Examination01 { pu原创 2020-12-31 19:14:07 · 133 阅读 · 0 评论 -
二、volatile可见性和原子性分析
1、volatile关键字的作用每个线程都有自己的缓存区,如下例子,线程1和线程2的缓存区中b=0线程2在修改t.b=2;时 线程1是不可见的。为了解决b的值更新以后对应的缓存区里的b的值也同步更新使用volatile关键字public volatile int b = 0;package volat;/** * volatile关键字,用于修饰变量,是一个变量 在多个线程间是可见的 * 在多个线程共享同一个变量的时候,可能会出现内存不可见的情况 * @author xzq */pu原创 2020-12-31 17:37:08 · 952 阅读 · 0 评论 -
一、多线程常见注意事项
1:线程安全示例线程1:a=5 执行 a – 此时 a=4 cpu切换线程执行线程2: a=4 执行a-- 此时 a=3 打印a=3线程1:打印,此时a=3线程3:a=3 执行a-- 此时 a=2,打a=2线程4:a=2执行a-- 此时 a=1,打a=1线程5:a=1 执行a-- 此时 a=0,打a=0可以看出线程1还未结束a的值已经被线程2减一等于3了。...原创 2020-12-31 14:33:23 · 966 阅读 · 0 评论