![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 54
王佑辉
个人笔记,多谢指正,不喜勿喷
展开
-
【线程池】fork与join
1.提交给Fork/Join线程池的任务需要继承RecursiveTask(有返回值)或RecursiveAction(没有返回值)6.Fork/Join在分治的基础上加入了多线程,可以把每个任务的分解和合并交给不同的线程来完成,进一步提升运算效率。7.Fork/Join默认会创建与cpu核心数大小相同的线程池,是cpu密集型任务。4.任务拆分是将一个大型任务拆分为算法上相同的小型任务,直至不能拆分可以直接求解。1.Fork/Join是jdk1.7加入的新的线程池实现。2.体现的是一种分治思想。原创 2023-07-24 17:59:49 · 222 阅读 · 0 评论 -
【线程池】异步模式之工作线程
1.工作线程即worker thread2.让有限的工作线程来轮流异步处理无限多的任务3.是一种分工模式4.典型实现是线程池,体现了经典设计模式中的享元模式5.对比另一种多线程设计模式(Thread-Per-Message),来一条消息便创建一个线程,这种模式会造成线程数量过多6.不同任务类型应该使用不同的线程池,这样能够避免饥饿,提升效率1.固定大小线程池会有饥饿现象2.一个线程池中有两个线程A和B,执行的任务有部分1和部分2,执行部分2需要依赖于任务的部分1。原创 2023-07-21 15:48:51 · 110 阅读 · 0 评论 -
【多线程】自定义线程池 仅供学习
*** @Description 自定义线程池*/@Slf4j// 任务队列// 线程集合// 核心线程数// 超时时间// 超时时间单位// 执行任务// 当任务数没有超过核心线程数时,直接交给worker对象执行log.debug("新增worker {} 任务对象 {}", worker, task);} else {// 如果任务数超过了核心线程数,加入任务队列暂存。原创 2023-07-11 22:49:05 · 229 阅读 · 0 评论 -
【多线程】原子引用AtomicMarkableReference
1.标记资源是否被修改。原创 2023-06-14 22:39:17 · 71 阅读 · 0 评论 -
【多线程】原子引用ABA问题
4.如果希望主线程能感知到其它线程动过该共享变量,则cas失败,所以比较值是不能解决问题的,需要再加一个版本号。3.对于主线程仅能判断出共享变量的值与最初值A是否相同,不能感知到A改为B又改回A的情况。2.在这期间,线程1将共享变量由A改为B,线程2再将共享变量B改为A。1.主线程准备将共享变量由A改为C。原创 2023-06-13 21:33:38 · 127 阅读 · 0 评论 -
【多线程】cas
1.compareAndSet,简称CAS2.也有Compare And Swap的说法3.必须是原子操作,在cpu的指令级别实现原子性4.compareAndSet方法内部是原子的,但不是用锁实现的。原创 2023-06-08 22:22:28 · 519 阅读 · 0 评论 -
【多线程】happens-before规则
5.线程1打断interrupt线程2之前对变量的写,对于其它线程得知线程t2被打断后对变量的读可见(通过线程2.interrupted或线程2.isInterrupted)4.线程结束前对变量的写,对其它线程得知它结束后的读可见,例如线程2调用线程1的isAlive()或线程1的join()等待它结束。1.规定了线程对共享变量的写操作对其它线程的读操作是可见的,是可见性与有序性的一套规则总结。1.线程解锁对象o之前对变量v的写,对后面对对象o加锁的其它线程对该变量v的读可见。原创 2023-06-06 22:22:36 · 538 阅读 · 0 评论 -
【多线程】volatile关键字
假如b是被volatile关键字修饰,则给b赋值为true之后,会产生一个写屏障,那么写屏障之前的操作 a=2的赋值操作不会重排到写屏障之后,也就是保证了a=2赋值操作在b=true的赋值操作之前。假如b是被volatile关键字修饰,则读取b变量时,会给b变量读操作前加一个读屏障,在读屏障之后的代码a=2,不会重排在读屏障之前,因此保证a=2操作在if(b)读b变量之后。8.不能解决指令交错,写屏障仅仅是保证之后的读能够读到最新的结果,不能保证另个线程b在线程a写之前读,然后在线程a写之后,线程b再写。原创 2023-05-27 23:13:21 · 919 阅读 · 0 评论 -
【多线程】共享资源的保护
【代码】【多线程】共享资源的保护。原创 2023-05-26 11:06:42 · 74 阅读 · 0 评论 -
【多线程】两阶段终止模式
2.interrupt() 打断线程,如果被打断的线程正在sleep、wait、join会导致被打断的线程抛出InterruptedException异常,并清除打断标记;2.stop方法会真正杀死线程,如果线程锁住了共享资源,杀死该线程后再也没有机会释放锁,其它线程将永远无法获取锁。4.睡眠期间有异常,设置打断标记,抓住异常,并重置打断标记,继续循环,判断被打断了,料理后事,结束循环。1.在一个线程t1中优雅地终止另一个线程t2,指终止t2线程前,让t2线程有一个料理后事的机会。原创 2023-05-25 16:44:29 · 908 阅读 · 0 评论 -
【多线程】线程的可见性
1.当一个线程修改了共享变量的值,其他线程会马上知道这个修改。当其他线程要读取这个变量的时候,最终会去内存中读取,而不是从缓存中读取2.一个线程对共享变量的修改,另一个线程可以感知到,称为可见性3.在CPU中存在MESI协议,即缓存的一致性协议:一个线程修改变量,CPU会刷新缓存,并刷新回内存,线程2得知线程1修改变量,cpu2通过总线嗅探机制,会重新去内存中加载变量a。原创 2023-05-25 14:17:47 · 1193 阅读 · 0 评论 -
【多线程】线程交替执行
【代码】【多线程】线程交替执行。原创 2023-05-21 22:30:51 · 182 阅读 · 0 评论 -
【多线程】线程顺序执行
【代码】【多线程】线程顺序执行。原创 2023-05-21 13:21:50 · 55 阅读 · 0 评论 -
【多线程】保护性暂停
【代码】【多线程】保护性暂停。原创 2023-05-08 22:31:38 · 49 阅读 · 0 评论 -
【多线程】为什么不建议使用Executors来创建线程池?
单个线程线程池创建时FinalizableDelegatedExecutorService用的是装饰器模式,只对外暴露ExecutorService接口,不能调用ThreadPoolExecutor中特有的方法,固定数量线程池对外暴露的是ThreadPoolExecutor对象,可以强转,调用setCorePoolSize等方法进行修改。4.与自己创建的线程的区别:a.自己创建一个单线程串行执行任务,任务执行失败而终止则没有任务不就措施,线程池执行失败会新建一个线程,保证线程池的正常工作;原创 2023-04-22 20:34:00 · 889 阅读 · 0 评论 -
【juc】ReentrantLock可重入锁
2.ReentrantLock的条件变量支持多个,synchronized不满足条件的线程都在同一个waitSet中等待,ReentrantLock可以让不同条件不满足的线程在不同的地方等待。3.可以设置为公平锁:竞争不到锁的线程在等待过程中,当锁释放后,谁先等待的谁先得到锁(先进先出);3.其它线程获取到锁,然后释放锁,只要时间小于tryLock的时间,尝试获取锁还是可以成功的。2.可以设置超时时间:规定时间内,线程1争抢不了锁,可以放弃锁的竞争。1.可中断:线程2可以让线程1获取的锁取消掉。原创 2023-04-09 21:52:27 · 327 阅读 · 0 评论 -
【多线程】哲学家就餐死锁问题
【代码】【多线程】哲学家就餐死锁问题。原创 2023-04-09 13:51:41 · 130 阅读 · 0 评论 -
【多线程】线程池
3.keepAliveTime:多余的空闲线程的存活时间,当前线程池数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。7.handler:拒绝策略,表示当队列满了并且工作线程-大于等于线程池的数量最大线程数(maxinumPoolSize)时如何来拒绝请求执行的runnable的策略。6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认的即可。原创 2023-04-04 22:30:38 · 4917 阅读 · 1 评论 -
【多线程】线程通信
17.Conditon中的await()对应Object的wait(),Condition中的signal()对应Object的notify(),Condition中的signalAll()对应Object的notifyAll()。13.await()、signal()、signalAll()是Condition接口中的方法,该接口是在Java 1.5中出现的,它用来替代传统的wait+notify实现线程间的协作,它的使用依赖于 Lock。8.这三个方法都是本地方法,并且被final修饰,无法被重写。原创 2023-03-29 21:45:00 · 374 阅读 · 0 评论 -
【多线程】synchronized和lock的区别
6.synchronized锁可重入、不可中断、不是公平锁;Lock锁可重入、可中断、可公平/不公平,并可以细分读写锁以提高效率。3.synchronized在代码执行完或出现异常时自动释放锁;Lock不会自动释放锁,需要在finally中显示释放锁。1.synchronized是Java关键字,在JVM层面实现加锁和解锁;Lock是一个接口,在代码层面实现加锁和解锁。5.synchronized无法得知是否获取锁成功;2.synchronized可以用在代码块上、方法上;Lock只能写在代码里。原创 2023-03-28 09:49:25 · 105 阅读 · 0 评论