随笔分类 - 并发学习总结
摘要:一、前言 开发中我们经常会用到异步方法调用,具体到代码层面,异步方法调用的实现方式有很多种,比如最原始的通过实现Runnable接口或者继承Thread类创建异步线程,然后启动异步线程;再如,可以直接用java.util.concurrent包提供的线程池相关API实现异步方法调用。 如果说可以用一
阅读全文
摘要:1、使用场景 一般情况下,主线程创建并启动子线程,如果子线程中执行大量耗时运算,主线程可能早于子线程结束。如果主线程需要知道子线程的执行结果时,就需要等待子线程执行结束。主线程可以sleep(xx),但这样的xx时间不好确定,因为子线程的执行时间不确定,join()方法比较合适这个场景。 2、joi
阅读全文
摘要:1、ThreadLocal的使用场景 ThreadLocal主要用来存储线程的本地数据,做到线程数据的隔离。常用的方法有:set()、get()、remove()分别对应存储、获取和删除。下面看几个使用场景: 场景1:在拦截器中的使用 //将其封装在工具类中 public class Context
阅读全文
摘要:1、1.7版本concurrentHashMap ConcurrentHashMap 和 HashMap 的实现原理是差不多的,但是因为 ConcurrentHashMap 是并发安全的,所以在实现上要比hashmap复杂一些。 在 JDK1.7 的实现上,ConrruentHashMap 由一个个
阅读全文
摘要:1、线程池的优势 (1)降低创建线程和销毁线程产生的性能开销; (2)提高响应速度,当有新任务需要执行时不需要等待线程创建就可以马上执行; (3)合理的设置线程池大小可以避免因为线程数超过硬件资源瓶颈造成的问题。 2、线程池Api 线程池返回值ExecuterService,用于管理线程池。 jav
阅读全文
摘要:1、阻塞队列分类 2、阻塞队列原理 基于ReentrantLock和Condition实现阻塞和线程间的通信。 Condition notEmpty = lock.newCondition( ) Condition notFull = lock.newCondition( ) (1)添加元素方法:a
阅读全文
摘要:Condition 1、Condition概述 对于synchronized,可以结合wait/notify实现线程的通信,Condition则是JUC中提供的一个多线程协调通信的工具类,可以让某些线程等待某个条件(condition),只有满足条件时才会被唤醒。 condition.await(
阅读全文
摘要:1、Lock接口的实现——并发包锁 (1)ReentrantLock 重入锁,重入锁指线程在获得锁之后,当该线程再次请求获得该锁不需要阻塞,而是可以直接获得锁,同时计数器增加重入次数。不同线程还是会阻塞的。 (2)ReentrantReadWriteLock 重入读写锁,实现了ReadWriteLo
阅读全文
摘要:1、缓存一致性问题 由于存储设备与处理器的运算速度差距很大,计算机系统在内存与处理器之间增加了一层高速缓存,将运算需要的数据复制到缓存中,让运算能快速进行。 有了高速缓存的存在以后,每个CPU的处理过程是, 先将计算需要用到的数据缓存在CPU高速缓存中,在CPU 进行计算时,直接从高速缓存中读取数据
阅读全文
摘要:jdk1.6之后对synchronized进行了优化,为了减少获得锁和释放锁带来的性能消耗,引入了偏向锁和轻量级锁,协调线程安全性和性能的平衡。这种优化主要解决上下文频繁切换,由于Java层面的线程与操作系统的原生线程有映射关系,如果要将一个线程进行阻塞或唤起都需要操作系统的协助,这就需要从用户态切
阅读全文
摘要:1、多线程的实现 * 继承Thread类创建线程,Thread本质上是实现了Runnable接口的一个实例。 * 实现Runnable接口,主要避免java单继承问题,如果一个类已经extends另一个类,就无法再继承Thread,但可以实现Runnable接口来创建线程。 * 实现Callable
阅读全文