多线程原理
文章平均质量分 94
柳成荫0529
这个作者很懒,什么都没留下…
展开
-
AQS
AQS简介 AQS是AbstractQueuedSynchronizer的简称,即抽象队列同步器,从字面意思上理解: 抽象:抽象类,只实现一些主要逻辑,有些方法由子类实现; 队列:使用先进先出(FIFO)队列存储数据; 同步:实现了同步的功能。 那AQS有什么用呢?AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的同步器,比如我们提到的ReentrantLock,Semaphore,ReentrantReadWriteLock,SynchronousQueue,FutureT原创 2021-01-03 19:46:09 · 103 阅读 · 0 评论 -
CAS与原子操作
乐观锁与悲观锁的概念 锁可以从不同的角度分类。其中,乐观锁和悲观锁是一种分类方式。 悲观锁 悲观锁就是我们常说的锁。对于悲观锁来说,它总是认为每次访问共享资源时会发生冲突,所以必须对每次数据操作加上锁,以保证临界区的程序同一时间只能有一个线程在执行。 乐观锁 乐观锁又称为“无锁”,顾名思义,它是乐观派。乐观锁总是假设对共享资源的访问没有冲突,线程可以不停地执行,无需加锁也无需等待。而一旦多个线程发生冲突,乐观锁通常是使用一种称为CAS的技术来保证线程执行的安全性。 由于无锁操作中没有锁的存在,因此不可能出现原创 2021-01-02 22:42:02 · 178 阅读 · 0 评论 -
synchronized与锁
这篇文章我们来聊一聊Java多线程里面的“锁”。 首先需要明确的一点是: Java多线程的锁都是基于对象的,Java中的每一个对象都可以作为一个锁。 还有一点需要注意的是,我们常听到的类锁其实也是对象锁。每个Java类在JVM中只有一个Class对象(可以有多个实例对象,多个实例共享这个Class对象),而Class对象也是特殊的Java对象。 所以我们常说的类锁,其实就是Class对象的锁。 Synchronized关键字 说到锁,我们通常会谈到synchronized这个关键字。它翻译成中文就是“同步”原创 2021-01-02 22:32:06 · 138 阅读 · 0 评论 -
volatile
几个基本概念 在介绍volatile之前,我们先回顾及介绍几个基本的概念。 内存可见性 在Java内存模型那一章我们介绍了JMM有一个主内存,每个线程有自己私有的工作内存,工作内存中保存了一些变量在主内存的拷贝。 内存可见性,指的是线程之间的可见性,当一个线程修改了共享变量时,另一个线程可以读取到这个修改后的值。 重排序 为优化程序性能,对原有的指令执行顺序进行优化重新排序。重排序可能发生在多个阶段,比如编译重排序、CPU重排序等。 happens-before规则 是一个给程序员使用的规则,只要程序员在写原创 2021-01-02 22:20:21 · 166 阅读 · 0 评论 -
重排序与happens-before
什么是重排序? 计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排。 为什么指令重排序可以提高性能? 简单地说,每一个指令都会包含多个步骤,每个步骤可能使用不同的硬件。因此,流水线技术产生了,它的原理是指令1还没有执行完,就可以开始执行指令2,而不用等到指令1执行结束之后再执行指令2,这样就大大提高了效率。 但是,流水线技术最害怕中断,恢复中断的代价是比较大的,所以我们要想尽办法不让流水线中断。指令重排就是减少中断的一种技术。 我们分析一下下面这个代码的执行情况: a = b + c; d原创 2021-01-02 22:08:06 · 178 阅读 · 0 评论 -
Java内存模型并发相关知识
并发编程模型的两个关键问题 线程间如何通信?即:线程之间以何种机制来交换信息 线程间如何同步?即:线程以何种机制来控制不同线程间操作发生的相对顺序 有两种并发模型可以解决这两个问题: 消息传递并发模型 共享内存并发模型 这两种模型之间的区别如下表所示: 在Java中,使用的是共享内存并发模型。 Java内存模型的抽象结构 运行时内存的划分 先谈一下运行时数据区,下面这张图相信大家一点都不陌生: 对于每一个线程来说,栈都是私有的,而堆是共有的。 也就是说在栈中的变量(局部变量、方法定义参数、异常处原创 2021-01-02 21:53:50 · 102 阅读 · 0 评论