在我们写代码的时候,经常会有批量创建任务并等待返回的场景;此时使用生产消费者并发的提交任务来代替for循环逐个执行任务能够大大提高代码效率;
然而不加限制的创建Goroutine也是会有内存溢出、CPU切换过多等资源浪费的情况;
本文讲述了Go中一些常用的控制Goroutine数量的方法;
源代码:
在我们写代码的时候,经常会有批量创建任务并等待返回的场景;此时使用生产消费者并发的提交任务来代替for循环逐个执行任务能够大大提高代码效率;
然而不加限制的创建Goroutine也是会有内存溢出、CPU切换过多等资源浪费的情况;
本文讲述了Go中一些常用的控制Goroutine数量的方法;
源代码:
Golang给了我们更加方便和简洁的语法实现并发操作,但是使用并发操作是需要考虑应用场景的,不考虑背景而滥用并发反而可能造成性能危机:有时并发操作并不一定比单线程的效率高;
本文首先通过素数筛方法并发计算质数,展现了golang以CSP为并发模型的并发编程特色;之后与单线程实现做对比,引出并发编程需要考虑背景的结论;
源代码:https://github.com/JasonkayZK/Go_Learn/tree/prime
在Java开发中,并发编程是一个不可或缺的东西。甚至有不会并发就相当于不会编程的言论。传统并发模型中有进程和线程的概念,而熟悉Python的同学应该有过使用yield的经历,而yield关键字就使用了协程的概念;并且在现在golang大火的环境下,golang中也通过协程来解决了并发编程的问题;
本文内容包括:
AQS全称为AbstractQueuedSynchronizer,它提供了一个FIFO队列,可以看成是一个用来实现同步锁以及其他涉及到同步功能的核心组件
本文内容包括:
前面讲解了线程池的原理, 而线程池任务的存储采用的是阻塞队列(需要的话要通过构造方法传入一个阻塞队列). 所以本篇介绍Java中的阻塞队列
在JUC包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题, 通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利
本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景
本文内容包括:
文章转自: Java 阻塞队列–BlockingQueue
前面两篇文章分析了Java中几种常见的线程池, 下面我们通过源码来看一看他们究竟在最底层是怎么实现的
本文内容包括:
源代码分析基于JDK11.0.5
如果觉得文章写的不错, 可以关注微信公众号: Coder张小凯
内容和博客同步更新~
系列文章入口:
在上一篇Java线程池ThreadPoolExecutor分析与实战的文章中, 手写了一个简单的线程池. 这篇紧接着上一篇, 通过分析JUC线程池源码, 来看看JDK中是如何设计线程池的
本文内容包括:
文章部分节选自: Java线程池-ThreadPoolExecutor原理分析与实战
源代码分析基于JDK11.0.5
如果觉得文章写的不错, 可以关注微信公众号: Coder张小凯
内容和博客同步更新~
在前面几种常见排序方法的优化(下)一文中, 我总结了针对归并排序的一些优化方法.但是即使是优化, 整个排序过程也是建立在单个线程当中的
而自顶向下的归并排序在将数组拆分之后, 左右两部分是不会被同一个递归栈访问的, 容易想到可以开辟两个线程(递归的)分别进行左右归并排序
本篇就在此基础之上探讨有关ForkJoin和Stream的一些操作
本文内容包括:
源代码:
如果觉得文章写的不错, 可以关注微信公众号: Coder张小凯
内容和博客同步更新~
本篇通过手写一个简单的线程池, 展现了Java线程池有关的内容, 并给出简单使用的实例
本文内容:
源代码:https://github.com/JasonkayZK/Java_Samples/tree/java-threadpool
最近总结了一套阿里云的面试题, 其中有一个ThreadLocal和线程池配合使用造成内存泄露的问题. 当时写了答案但是感觉对于ThreadLocal的理解还不是特别深入, 所以想再看一下源码.