![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java并发艺术
文章平均质量分 64
jay_boolean
这个作者很懒,什么都没留下…
展开
-
Java多线程1:为什么要使用多线程——学习方腾飞Java并发编程的艺术
为什么要使用多线程简单来讲,就是为了程序运行的更快1、发挥多处理器的强大能力(见http://www.cnblogs.com/xrq730/p/4850883.html)现在,多处理器系统正日益盛行,并且价格不断降低,即时在低端服务器和中断桌面系统中,通常也会采用多个处理器,这种趋势还在进一步加快,因为通过提高时钟频率来提升性能已变得越来越困难,处理器生产厂商都开始转而在单个芯片上放置...原创 2018-07-26 12:30:50 · 938 阅读 · 0 评论 -
Java多线程16:ArrayBlockingQueue的详细介绍及源码分析——学习方腾飞Java并发编程的艺术
ArrayBlockingQueueArrayBlockingQueue: 1、数组实现:ArrayBlockingQueue内部其实是一个数组 2、阻塞队列:当资源已经被某个线程占有的时候,当请求访问这个资源的线程被阻塞,必须等到占用资源的线程释放锁,才有机会去竞争锁 3、有界:是指其对应的数组有size,当队列满的时候无法添加,必须等到有其他线程释放位置才可以加入 4、线程安全:内...原创 2018-08-13 20:47:06 · 242 阅读 · 0 评论 -
Java多线程15:ConcurrentHashMap的详细介绍及源码分析——学习方腾飞Java并发编程的艺术
ConcurrentHashMapHashMap是线程不安全的,我们假想假设1、向HashMap中插入数据的时候看一下HashMap插入的源码(JDK10)从1.8开始HashMap的源码就发生了很大变化,引入了红黑树,但是其实方法的本质没变,只不过当hash冲突时,如果一个hash位置上的数量超过了7个,就会将原来的连标转为树,这里不细讲public V put(K key,...原创 2018-08-08 19:46:21 · 196 阅读 · 0 评论 -
Java多线程14:CopyOnWriteArrayList的详细介绍——学习方腾飞Java并发编程的艺术
CopyOnWriteArrayList读写锁,线程安全的ArrayList。它具有以下特性: 1、它最适合于读远多写操作,需要在遍历期间防止线程间的冲突。 2、它是线程安全的。 3、因为读写锁的一些操作需要复制整个基础数组,因此对于add()、remove()、set()等操作开销很大,因此应避免此类操作。 4、使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。源码...原创 2018-08-07 21:44:29 · 480 阅读 · 0 评论 -
Java多线程13:Exchanger组件的详细介绍——学习方腾飞Java并发编程的艺术
ExchangerExchanger从名字也可以看出,用于进行线程间的数据交换。他提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,如果一个线程先执行了exchange()方法,他会一直等待第二个线程也执行到exchange()方法,然后进行交换数据。应用场景遗传算法,遗传算法例需要选出两个人作为交配对象,只是后会交换两人的数据,并使用交叉规则得出两人交配结果。 校对工作:比...原创 2018-08-07 20:20:35 · 127 阅读 · 0 评论 -
Java 多线程12: 信号量Semaphore详细介绍——学习方腾飞Java并发编程的艺术
SemaphoreSemaphore: 计数信号量,它的本质是一个”共享锁”,可以用来控制并发数。通过协调哥哥线程,以保证合理的使用公共资源。首先Semaphore的构造参数接受一个整形数字,表示的就是允许多少个线程获得许可证,首先通过acquire()获得许可证,当线程数达到构造出来的数字时,其他线程会阻塞,直到有其他运行的线程通过release()方法归还许可证。也可以通过tryAcq...原创 2018-08-07 19:59:15 · 141 阅读 · 0 评论 -
Java多线程9:线程池的详细介绍——学习方腾飞Java并发编程的艺术
线程池线程池的处理流程1、过来一个任务,走2 2、检查核心线程池是否已满,满了走3;否则创建线程执行任务 3、检查队列是否已满,满了走4;否则创建线程执行任务 4、检查哈线程池是否已满,满了走5;否则创建线程执行任务 5、按照策略处理无法执行的任务(拒绝)ThreadPoolExecutor 图中为ThreadPoolExecutor执行示意图-来自Java并发编...原创 2018-08-02 16:39:45 · 236 阅读 · 0 评论 -
Java多线程11:CyclicBarrier组件的详细介绍——学习方腾飞Java并发编程的艺术
CyclicBarrierCyclicBarrier: 循环屏障,效果是让多个线程在这个屏障前等待(await()方法之前),当所有线程都执行到了这个位置时,再一起继续执行后面的动作。CyclicBarrier的一个例子import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.Co...原创 2018-08-06 21:27:19 · 149 阅读 · 0 评论 -
Java多线程10:CountDownLatch组件的详细介绍——学习方腾飞Java并发编程的艺术
CountDownLatchCountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行后续工作CountDownLatch是在java1.5被引入的,一起被引入的还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,这几个后面也会挨个介绍一下,它们都存在于java.util.co...原创 2018-08-06 20:45:13 · 128 阅读 · 0 评论 -
Java多线程8:Condition的详细介绍——学习方腾飞Java并发编程的艺术
Conditionsynchronized与wait()和nitofy()/notifyAll()方法相结合可以实现等待/通知模型,ReentrantLock同样可以,需要借助Condition,且Condition有更好的灵活性,具体体现在: 1、一个Lock里面可以创建多个Condition实例,实现多路通知 2、notify()方法进行通知时,被通知的线程时Java虚拟机随机选择的,...原创 2018-08-01 17:59:19 · 568 阅读 · 0 评论 -
Java多线程7:ReentrantLock()锁的详细介绍——学习方腾飞Java并发编程的艺术
ReentrantLock使用synchronized关键字会隐式地创建锁,但是却将锁的获取和释放固定化了。当然这种方式也便捷了程序员不用手动锁定和释放锁,但是也带来了一定的不方便,而用Lock却可以更加的灵活。 重入锁ReentrantLock,支持重进入的锁,表示该锁能够支持一个线程对资源的重复加锁。在其调用lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不被...原创 2018-08-01 17:40:30 · 154 阅读 · 0 评论 -
Java多线程6:线程间通信-ThreadLocal详解(源码)——学习方腾飞Java并发编程的艺术
ThreadLocal详解 构建了一个类,它具有begin() 和 end()两个方法,而end()方法返回从begin()方法调用开始到end()方法被调用的时间差。import java.util.concurrent.TimeUnit;public class MyThread07 { private static final ThreadLocal<Long>...原创 2018-07-31 21:27:18 · 228 阅读 · 0 评论 -
Java多线程5:线程间通信-Thread.join()的使用——学习方腾飞Java并发编程的艺术
Thread.join()如果一个线程A执行了Thread.join()方法,含义是,当前线程A等待Thread线程终止之后才从Thread.join()返回。线程Thread除了Thread.join(),还有Thread.join(long millis)和Thread.join(long millis, int nanos)两个具备超时特性的方法。表示如果线程thrad在给定时间内没有终...原创 2018-07-31 20:32:19 · 245 阅读 · 0 评论 -
Java多线程4:线程间通信-管道输入/输出流(PipedOutputStream,PipedInputStream,PipedReader和PipedWrite)——学习方腾飞Java并发编程的艺术
管道输入输出流管道输入输出流主要用于线程间的数据传输,传输媒介为内存import java.io.IOException;import java.io.PipedReader;import java.io.PipedWriter;public class MyThread05 { public static void main(String[] args) throws...原创 2018-07-31 20:10:45 · 241 阅读 · 0 评论 -
Java多线程3:线程间通信-等待/通知机制(wait(),notify()¬ifyAll())——学习方腾飞Java并发编程的艺术
等待/通知机制等待/通知机制,是指线程A调用了对象O的wait()方法进入等待状态,而另外一个线程B调用了对象O的notify() or notifyAll()方法,线程A收到后从对象O的wait()方法返回,执行后续操作。线程间通过对象O来完成交互,对象上的notify(),notifyAll()如同信号一般,用来通知其他线程开始工作。 其中wait(),notify(),notifyAl...原创 2018-07-31 19:55:32 · 195 阅读 · 0 评论 -
Java多线程2:Synchronized——学习方腾飞Java并发编程的艺术
synchronized原理相信大家对于synchronized都不陌生,并且或许你还有一种记忆关于synchronized和Lock的优点和缺点。大家都觉得Lock怎么怎么方便,synchronized方法是重量级锁,但是其实在Java版本不断的更新中,1.6对synchronized进行了各种优化,他的情况有很大的改善,之前看到过一篇博客详细分析了synchronized的性能,其实越来越...原创 2018-07-31 18:00:07 · 148 阅读 · 0 评论 -
Java多线程17:ConcurrentLinkedQueue的详细介绍及源码分析——学习方腾飞Java并发编程的艺术
ConcurrentLinkedQueueConcurrentLinkedQueue 1、线程安全:通过volatile来实现多线程对竞争资源的互斥访问 2、无界队列:无大小 3、链表实现:内部维持着一个链表 4、FIFO,先进先出:元素都是从尾部插入到链表,从头部开始返回。介绍ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的...原创 2018-08-13 21:24:54 · 282 阅读 · 0 评论