![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发
与衫
这个作者很懒,什么都没留下…
展开
-
volatile关键字
内存模型的相关概念计算机在执行程序时,每条指令都是在CPU中执行的,在执行指令过程中,会涉及到数据的读取和写入。程序运行过程中的临时数据是存放在主存(物理内存)当中的,需要将主存中的数据读取到内存中,而CPU执行速度很快,这时就存在一个问题,从内存读取数据与向内存写入数据的过程跟CPU执行指令的执行速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速...原创 2018-10-22 15:15:20 · 2098 阅读 · 1 评论 -
ThreadLocal
/** * ThreadLocal保证线程安全测试 */public class ThreadLocalDemo { //看底层源码,其实ThreadLocal底层就封装了一个自定义的ThreadLocalMap的Map对象,每个线程作为key, //定义的num变量作为value,每个线程都独享一个副本,所以就不存在线程安全问题了。 static ThreadL...原创 2018-11-28 10:47:15 · 122 阅读 · 0 评论 -
java并发安全解析
并发安全类的线程安全定义:如果多线程下使用这个类,不管多线程如何使用和调度这个类,这个类总是表示出正确的行为,这个类就是线程安全的。类的线程安全表现为: 1,操作的原子性 2,内存的可见性不做正确的同步,在多个线程之间共享状态的时候,就会出现线程不安全。怎么才能做到类的线程安全?1,栈封闭:所有的变量都是在方法内部声明的,这些变量都处于栈封闭状态,都是线程安全的。2,无状...原创 2018-10-30 13:03:31 · 194 阅读 · 0 评论 -
线程池解析
我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 这就出现了线程池。线程池线程池:当并发线程多了之后,每个线...原创 2018-10-30 11:53:32 · 126 阅读 · 0 评论 -
JMM和底层实现原理
现代计算机物理上的内存模型物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机对并发的处理方案对于虚拟机的实现也有相当大的参考意义。其中一个重要的复杂性来源是绝大多数的运算任务都不可能只靠处理器“计算”就能完成,处理器至少要与内存交互,如读取运算数据、存储运算结果等,这个I/O操作是很难消除的(无法仅靠寄存器来完成所有运算任务)。早期计算机中cpu和内存的速度是差不多的,但在现代计算机中...原创 2018-10-27 12:52:19 · 593 阅读 · 0 评论 -
阻塞队列
什么是阻塞队列?阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。阻塞队列总结阻塞队列:1,概念、生产者...原创 2018-10-30 11:46:36 · 533 阅读 · 2 评论 -
AQS解析
AQS谈到并发,不得不谈ReentrantLock,详情见上篇文章[https://blog.csdn.net/qq_28822933/article/details/83539208],而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantL...原创 2018-10-30 11:43:26 · 213 阅读 · 0 评论 -
显示锁解析
显示锁LockLock是一个接口,提供了无条件的、可轮询的、定时的、可中断的锁获取操作,所有的加锁和解锁操作方法都是显示的,因而称为显示锁。Lock接口和synchronized的比较:1,synchronized代码更简洁2,Lock,效率比隐士锁更高3,Lock可以在获取锁可以被中断,超时获取锁,尝试获取锁Lock接口有三个实现类:1,ReentrantLock,2,Reen...原创 2018-10-30 11:29:32 · 760 阅读 · 0 评论 -
CAS原子操作
原子操作所谓原子操作是指不会被线程调度机制打断的操作,当某次操作一旦开始,就一直运行到结束,中间不会有任何中断。举个例子:A想要从自己的帐户中转1000块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。在这个事务里,要做如下操作:从A的帐户中减去1000块钱。如果A的帐户原来有3000块钱,现在就变成2000块钱了。在B的帐户里加1000块钱。如果B的帐户如果...原创 2018-10-24 11:39:48 · 6965 阅读 · 0 评论 -
常用的并发工具类
在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier、Semaphore和ExchangeCountDownLatchCountDownLatch是一个同步计数器,初始化的时候 传入需要计数的线程等待数,可以是需要等待执行完成的线程数,或者大于。作用:用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用...原创 2018-10-24 11:00:04 · 5513 阅读 · 1 评论 -
ForkJoin详解
Fork/Join是一个分而治之的任务框架,如一个任务需要多线程执行,分割成很多块计算的时候,可以采用这种方法。动态规范:和分而治之不同的是,每个小任务之间互相联系。工作密取:分而治之分割了每个任务之后,某个线程提前完成了任务,就会去其他线程偷取任务来完成,加快执行效率。同时,第一个分配的线程是从队列中的头部拿任务,当完成任务的线程去其他队列拿任务的时候是从尾部拿任务,所以这样就避免了竞争。...原创 2018-10-22 15:43:11 · 6375 阅读 · 1 评论 -
ThreadLocal总结
ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。ThreadLocal内部就是一个ThreadLocalMap。ThreadLocal是如何为每个线程创建变量的副本的:1,首先,在每个线程Thread内部有一个ThreadLocal.ThreadL...原创 2018-10-22 15:20:28 · 2145 阅读 · 1 评论 -
ForkJoin实战
需求解析2.8G的dicom文件,并且修改文件内容,将源文件删除后再创建新文件。实现public class AnonymousTask extends RecursiveAction { //要搜寻的目录 private File dir; public AnonymousTask(File dir) { this.dir = dir; ...原创 2019-01-07 11:35:29 · 493 阅读 · 0 评论