首页
首页
沸点
课程
直播
活动
竞赛
商城
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
会员
登录
注册
Java 多线程
apigfly
创建于2021-05-10
订阅专栏
学习下 Doug Lea 老爷子的并发思维
等 7 人订阅
共8篇文章
创建于2021-05-10
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
Java 多线程(八)Java 内存模型
内存模型需要解决的问题是:在什么条件下,读取aVariable的线程将看到这个值为3. 在编译器中生成的指令顺序可以与源代码中的顺序不同;此外编译器还会把变量保存在寄存器而不是内存中。 这些因素都会使得一个线程无法看到变量的最新值。 由于时钟频率越来越难以提高,很多厂商转而生产…
Java 多线程(七)原子变量与非阻塞同步机制
当多个线程竞争锁时,JVM 需要借助操作系统的功能将一些线程挂起并且在稍后恢复运行。当线程恢复执行时,必须等待其他线程执行完它们的时间片以后,才能被调度执行。在挂起和恢复线程的过程中存在很大的开销,并且存在较长时间的中断。 例如:i++自增问题。看起来像是原子操作,但事实上包含…
Java 多线程(六)使用 AQS 的工具类
在基于 AQS 构建的同步器类中,最基本的操作包括各种形式的锁获取和释放操作。并且获取操作是一种依赖状态的操作,并且通常会阻塞。 如下伪代码给出了 AQS 获取与释放的简单逻辑。 (Douge Lea 老爷子源码写的太精妙,得慢慢品) 首先,同步器判断当前状态是否允许获得操作,…
Java 多线程(五)显式锁与synchronized
在Lock的实现中必须提供与内部锁相同的内存可见性语义,但在加锁语义、调度算法、顺序保证以及性能特性等方面可以有所不同。 ReentrantLock 实现了 Lock接口,并提供了与synchronized相同的互斥行和内存可见性。并且与synchronized一样,Reent…
Java 多线程(四)性能与可伸缩性
使用多线程的目的是提升整体性能,但与单线程的方法比,使用多线程总会引起一些额外的开销。照成这些开销的操作包括:线程之间的协调(例如加锁、触发信号以及内存同步等),增加的上下文切换,线程的创建和销毁,以及线程的调度等。 想要通过并发获得更好的性能,需要努力做好两件事情:更有效地利…
Java 多线程(三)请用Executor优化任务执行
本篇文章通过服务器通信和页面渲染两个功能的实现来加深多线程中Future和Executor的理解。 代码很简单,理论上没什么毛病,但是实际使用中只能处理一个请求。但是当处理任务很耗时并且在多次请求时会阻塞无法及时响应。 由此可见串行处理机制通常都无法提供高吞吐率或快速响应性。 …
Java 多线程(二)多线程基础工具类
与 HashMap一样,ConcurrentHashMap也是一个基于散列的 Map,但他使用了一种完全不同的加锁策略来提供更高的并发性和伸缩性。ConcurrentHashMap并不是将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器,而是使用一种粒度更细的加锁机制…
Java 多线程(一)线程安全基础
最低安全性适用于绝大多数变量,但是存在一个例外,非 volatile 类型的64位数值变量(double 和 lang)。Java 内存模型要求,变量的读取操作和写入操作必须是原子操作,但对于非 volatile 类型的 long 和 double 变量,JVM 允许将64位的…