并发编程
文章平均质量分 74
AndysCat
这个作者很懒,什么都没留下…
展开
-
《Java并发系列》0.并发编程基础
1.线程现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个进程中可以创建多个线程,这些线程都拥有各自的计数器,堆栈和局部变量等属性,并且能够访问共享的内存变量。一个普通的Java程序,运行main函数时可能出现的线程:mian //函数入口Reference Handler //清除Reference的线程Finalizer // 调用对象的finalize方法的线程Si原创 2016-11-15 20:46:08 · 243 阅读 · 0 评论 -
【并发编程系列】1.并发安全问题的源头
0.定义可见性: 一个线程对共享变量的修改,另一个线程能够立刻看到。原子性: 一个或多个操作在CPU执行过程中不被中断,称为原子性。有序性: 程序按照代码的先后顺序执行。导致可见性问题的原因是CPU缓存;导致有序性问题的原因是编译优化。线程切换可能带来原子性问题解决问题的直接方法就是禁用缓存和优化。Java内存模型JVM如何按需禁用缓存和编译优化的方法。具体来说这些方法包括 vo...原创 2019-03-13 19:06:28 · 217 阅读 · 0 评论 -
volatile的适用场景.md
一般多线程问题涉及到两个特性:原子性和可见性。关键字synchronized举例,如果把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。原子性意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护。从而防止多个线程在更新共享状态时相互冲突。可见性则更为微妙,它必须...原创 2019-03-12 10:19:18 · 148 阅读 · 0 评论 -
Volatile和“Happens-Before”原则.md
volatile不是Java独有的,C语言也有,它的直接目的就是禁用CPU缓存。使用volatile修饰的变量,它实现的作用是,对于这个变量的读写,不能使用CPU缓存必须从内存中写入或读出。看一个例子,线程A执行writer方法,线程B执行reader方法,那么输出x的值是多少呢:public class VolatileApp { int x = 0; volatile b...原创 2019-03-15 18:45:58 · 372 阅读 · 0 评论 -
Java 线程池的submit的使用与分析.md
在Java5以后,通过Executor来启动线程比用Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特性。我们用的最多的execute方法,0.异步返回值的场景我们先不用线程池,来实现一个功能。加入周末了,几个小伙伴要一块做饭,假设做饭需要3个步骤,分别是:1.打扫厨房卫生,准备厨具2.买菜3.炒菜现在我们怎么分工呢,现实...原创 2019-01-25 19:20:18 · 6977 阅读 · 0 评论 -
Java线程池的典型用法.md
Java中线程的出现通常是实现异步处理的功能,我们创建和使用一个线程非常简单,但是有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。为了解决这个问题,线程池就出现了。线程池可以使得线程执行完一个任务之后,不被销毁进而复用,从而避免了频繁创建和销毁线程的资源消耗。Java中线程池对应的...原创 2019-01-24 15:27:52 · 185 阅读 · 0 评论 -
AtomicInteger的实现原理.md
1.基本AtomicInteger是对Integer类型的一个包装,提供原子性的访问和更新操作。其原子性的操作是基于CAS实现的。CAS的过程是这样,执行运算时,使用当前数据值作为判断条件,利用CAS指令视图进行更新。更新之前获取内存中的最新值,与传来的当前值作比较。如果数值没有变,则说明没有其他线程进行并发修改,更新操作成功。则否则要么进行重试,要么返回结果。2.AtomaticInteg...原创 2018-12-11 20:01:05 · 1466 阅读 · 0 评论 -
《Java并发编程的艺术》笔记五——Java线程基础.md
0.线程的状态名称 说明 New 即线程刚刚创建,而并未执行 Runnable 运行状态,Java线程将操作系统中的就绪和运行两种状态笼统的称作“运行中” Blocked 阻塞状态,表示线程阻塞于锁 Waiting 等待状态,表示线程进入等待状态,需要等待其他线程做出一些动作(通知或中断) TimeWaiting 超时等待状态,在指定时间内自行返回 Termicaled 终止状原创 2017-09-03 13:38:30 · 283 阅读 · 0 评论 -
《Java并发编程的艺术》笔记二——Java并发机制的底层实现原理.md
0.Java代码执行过程Java代码在编译之后会变成Java字节码,Java字节码被类加载器加载到JVM中,JVM执行字节码,最终转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖与JVM的实现和CPU的执行。 b本节探讨下Java并发机制的实现原理。1. volatile的应用在并发编程中synchronized和volatile都扮演者重要角色。volatile是轻量级的synchro原创 2017-08-13 16:37:48 · 286 阅读 · 0 评论 -
《Java并发编程的艺术》笔记四——Java如何实现原子操作.md
在Java中可以通过锁和循环CAS的方式实现原子操作。注:CAS(比较与交换,Compare and swap) 是一种有名的无锁算法。CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”,CAS是一种 乐观锁 技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次原创 2017-08-13 20:54:16 · 327 阅读 · 0 评论 -
《Java并发编程的艺术》笔记三——锁的升级与对比.md
0. 背景Java SE1.6 为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级”锁。在Java SE 1.6 中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。这几个状态会随着竞争情况依次升级。锁可以升级,但不能被降级,这意味着偏向锁升级为轻量级状态锁后不能降级成偏向锁。3.这种锁升级但不能降级的策略目的是提高获得锁和释放锁的效率。1原创 2017-08-13 17:17:43 · 535 阅读 · 0 评论 -
《Java并发编程的艺术》笔记一——并发编程中的概念.md
0.背景最近重温《并发编程的艺术》这本书,觉得里面有些不错的内容,打算截取一部分作为笔记和大家共同学习。 并发编程的目的是让程序运行的更快。下面是并发编程的一些关键词:1 上下文切换即使是单核处理器也支持多线程执行代码,CPU通过给每一个线程分配CPU时间来实现这个机制。时间篇是CPU分配給各个线程的时间,因为通常时间片设置的很短,所以CPU通过不停的切换线程执行,给我们造成线程是同时运行的错觉。原创 2017-08-13 15:25:32 · 288 阅读 · 0 评论 -
【同步-专栏系列】2.利用互斥锁解决原子性问题
原子性的定义:一个或多个操作在CPU的执行过程中,不被中断的特性叫做原子性。我们知道引起原子性问题的原因是“线程切换”。所以如果能够禁止线程切换就解决问题了?而操作系统是依赖CPU中断做线程切换的,那么我们禁用CPU中断不就行了吗?在单核CPU的环境下,这个答案是可行的。但是现在是多核CPU时代。在多核CPU场景下,假如同一时刻有两个线程在运行,一个线程执行在CPU-1上,一个执行在CPU-2...原创 2019-04-01 19:42:20 · 243 阅读 · 0 评论