
并发编程
文章平均质量分 74
麦田
生命本来就是一束耀眼的花火...
展开
-
Java并发编程之CountDownLatch
一、场景描述在多线程程序设计中,经常会遇到一个线程等待一个或多个线程的场景例如:百米赛跑,十名运动员同时起跑,由于速度的快慢,肯定有先到达和后到达的,而终点有个统计成绩的仪器,当所有选手到达终点时,它会统计所有人的成绩并进行排序,然后把结果发送到汇报成绩的系统。再例如:当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有原创 2017-07-12 22:53:35 · 1598 阅读 · 0 评论 -
Java并发编程之final
final域的重排序规则对于final域,编译器和处理器要遵守两个重排序规则。在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面通过一些示例性的代码来分别说明这两个规则。public class FinalExample {原创 2018-01-03 23:15:25 · 1277 阅读 · 1 评论 -
Java并发编程之内存模型
硬件的效率与一致性让计算机并发执行若干运算任务不可能只靠处理器“计算”就能完成,处理器至少要与内存交互,如读取运算数据、存储运算结果的哪个,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲;将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存原创 2017-12-26 21:09:24 · 907 阅读 · 0 评论 -
Java并发编程之volatile
volatile可以说是Java虚拟机提供的最轻量级的同步机制,Java内存模型对volatile专门定义了一些特殊的访问规则。当一个变量定义为volatile之后,它将具备两种特性,第一是保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。 而普通变量不能做到这一点,普通变量的值在线程间传递均需要通过主内存来完成,例如,线程A修改一原创 2017-12-30 22:25:35 · 726 阅读 · 0 评论 -
Java线程池实现原理
前言在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其他更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。第二:提高响应速度。第三:提高线程的可管理性。原创 2017-10-17 14:23:33 · 2361 阅读 · 0 评论 -
了解Java线程的start方法如何回调run方法
Java 创建线程的方法实际上,创建线程最重要的是提供线程函数(回调函数),该函数作为新创建线程的入口函数,实现自己想要的功能。Java 提供了两种方法来创建一个线程:继承 Thread 类class MyThread extends Thread{ public void run() { System.out.println("My thread is start原创 2017-11-07 19:53:45 · 6982 阅读 · 20 评论 -
ThreadLocal使用
ThreadLocal含义ThreadLocal叫做线程本地变量,也有叫线程局部变量。ThreadLocal提供了一种访问某个变量的特殊方式:访问到的变量属于当前线程,即保证每个线程的变量不一样,而同一个线程在任何地方拿到的变量都是一致的,这就是所谓的线程隔离应用场景ThreadLocal通常用来共享数据,当需要在多个方法中使用某个变量,这个变量是当前线程的状态,其他线程不依赖这个变量原创 2017-10-11 15:53:56 · 961 阅读 · 0 评论 -
Java ConcurrentModificationException异常解决
上篇文章介绍Iterator遍历ArrayList时有可能引发ConcurrentModificationException异常产生的原因是modCount和expectedModCount的值不一致,具体介绍参见 Iterator迭代器异常解决方法1、单线程环境仔细观察我们会发现Iterator也提供了一个remove()方法,实质也是调用了ArrayList中的remove,源原创 2017-08-09 23:02:07 · 2185 阅读 · 1 评论 -
Java并发编程之Lock
Lock是一个接口提供了无条件的、可轮询的、定时的、可中断的锁获取操作,所有加锁和解锁的方法都是显式的。 我们知道,synchronized是Java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但synchronized粒度有些大,在处理实际问题时存在诸多局限性,比如响应中断等。Lock提供了比synchronized更广泛的锁操作,它能以更优雅的方式处理线程同步原创 2017-07-19 23:25:19 · 923 阅读 · 0 评论 -
Java并发编程之synchronized
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一个时间,只有一个线程可以进行操作。多线程的同步机制对资源进行加锁,同步用以解决多个线程同时访问时可能出现的问题。对于普通同步方法,锁是当前实例对象。对于静态同步方法,锁是当前类的Class对象。对于同步方法块,锁是Synchonized括号里配置的对象。当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异原创 2017-07-19 09:38:29 · 2489 阅读 · 4 评论 -
Java并发编程之读写锁
读写锁维护了一对相关的锁,一个用于只读操作,一个用于写入操作。只要没有writer,读取锁可以由多个reader线程同时保持。写入锁是独占的。可重入读写锁 ReentrantReadWriteLockReentrantReadWriteLock对象提供了readLock()和writeLock()方法, 用于获取读取锁和写入锁. 读取锁允许多个reader线程同时持有, 而写入锁原创 2017-07-21 23:19:16 · 1201 阅读 · 2 评论 -
Java并发编程之重入锁
重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞,该特性的实现需要解决以下两个问题。1、线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。2、锁的最终释放。线程重复n次获取了锁,随后在第n次释放该锁后,其他线程能够获取到该锁。锁的最终释放要求锁对于获取进行计原创 2017-07-20 22:40:07 · 1241 阅读 · 4 评论 -
Java并发编程之CyclicBarrier
一、场景描述有四个游戏玩家玩游戏,游戏有三个关卡,每个关卡必须要所有玩家都到达后才能允许通过。其实这个场景里的玩家中如果有玩家A先到了关卡1,他必须等到其他所有玩家都到达关卡1时才能通过,也就是说线程之间需要相互等待。这和CountDownLatch的应用场景有区别,CountDownLatch里的线程是到了运行的目标后继续干自己的其他事情,而这里的线程需要等待其他线程后才能继续完成下面的工作原创 2017-07-13 23:01:33 · 2735 阅读 · 1 评论 -
Java使用阻塞队列BlockingQueue实现生产者消费者
什么是阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。1、支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2、支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。...原创 2018-02-22 22:58:45 · 6745 阅读 · 0 评论