![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
DLC的学习笔记
这个作者很懒,什么都没留下…
展开
-
Future和Callable
一、概览1.Runnable的缺陷Runnable不支持返回值,因为run()是一个void方法。也不能抛出checked Exception。这是因为再往上抛出,也没法处理了,不如在这里处理。2.Callable接口类似于Runnable,实现它的call方法就像是实现Runnable中的run方法一样。不同的是它是有返回值的。源码public interface Callable<V> { /** * Computes a result, or throw原创 2020-06-16 19:46:00 · 174 阅读 · 0 评论 -
AQS
一、为什么需要AQS仔细观察锁和协作类,就会发现有一个共同点:闸门。既然这些协作类,它们有很多工作都是类似的,所以如果提取出一个工具类,那么就可以直接用。对于ReentrantLock和Semaphore的实现而言,就可以屏蔽很多细节,只关注自己的业务逻辑就可以了。1.如果没有AQS就需要每个工具类自己实现:同步状态的原子性管理线程的阻塞与解除阻塞队列的管理2.Semaphore和AQS的关系Semaphore内部有一个Sync类,其继承了AQS。同样的,CountDownLatch原创 2020-06-13 14:45:34 · 136 阅读 · 0 评论 -
控制并发流程
一、概览二、CountDownLatch1.作用倒数结束之前,一直处于等待状态。直到倒数结束,此线程才继续工作。2.方法CountDownLatch(int count)构造函数,参数count为需要倒数的值。awiait()调用这个方法的线程会被挂起,直到count为0才继续执行。countDown()调用一次这个方法,会将count减1。3.代码示例假设这样一个场景:一件产品需要五个人都质检完成后才能进行下一轮。public class countDownDemo {原创 2020-06-12 14:19:15 · 256 阅读 · 0 评论 -
并发容器类
一、并发容器概览ConcurrentHashMap: 线程安全的HashMapCopyOnWriteArrayList:线程安全的ArrayListBlockingQueue:是一个接口,表示阻塞队列,非常适合用于作为数据共享的通道。ConcurrentLinkedQueue:高效的非阻塞并发队列,使用链表实现。可看作一个线程安全的LinkedList。ConcurrentSkipListMap:是一个Map,使用跳表的数据结构进行快速查找。二、ConcurrentHashMap1.Map简介原创 2020-06-10 21:55:38 · 255 阅读 · 0 评论 -
final关键字和不变性
一、什么是不变性如果对象在被创建后,状态就不能被修改,那么它就是不可变的。具有不变性的对象一定是线程安全的,我们不需要对其采取任何额外的安全措施,也能保证线程安全。二、final1.修饰方法修饰方法表示这个方法不可以被重写不能修饰构造方法引申:static修饰的也不能重写2.修饰类表示不可被继承String就是final的3.修饰对象表示对象的引用不可变,而对象本身的属性可以变化。...原创 2020-06-02 16:04:03 · 219 阅读 · 0 评论 -
CAS
一、什么是CASCAS即Compare And Swap。CAS主要用在并发领域,用来实现不可被打断的数据交换操作。CAS有三个操作数:内存值V、预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,才将内存值修改为B,否则什么都不做。最后返回现在的V值。使用代码模拟:public class SimulatedCAS{ private volatile int value; //使用synchronized来保证原子性 public synchronized int原创 2020-06-01 15:57:20 · 107 阅读 · 0 评论 -
Atomic包
一、原子类一个操作是不可中断的,即便多线程情况下也可以保证;java.util.concurrent.atomic包中的类都是具有原子性的;原子类相比于锁的优势:粒度更细,变量级别通常效率更高,高度竞争下效率降低二、6类原子类三、Atomic基本类型原子类AtomicInteger就是对Integer的封装,利用CAS实现。常用方法public final int get()获取当前的值public final int getAndSet(int newValue)获取原创 2020-05-31 16:51:55 · 179 阅读 · 0 评论 -
ThreadLocal【一次解决老大难问题】
一、使用场景每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random)每个线程内需要保存全局变量(例如在拦截器中获取用户信息),可以让不同方法直接使用,避免参数传递的麻烦。1.每个线程需要一个独享的对象每个Thread内有自己的实例副本,不共享。SimpleDateFormat的进化之路自己写一个类,实现两个线程分别打印出时间信...原创 2020-04-28 10:26:52 · 826 阅读 · 0 评论 -
线程池【治理线程的最大法宝】
一、线程池的介绍1.线程池的重要性(1)如果不使用线程池,那么每一个任务都会新开一个线程如果任务很多,那么就会反复创建和销毁很多线程,造成很大的开销。过多的线程会占用太多内存。(2)线程池的好处加快响应速度合理利用CPU和内存统一管理(3)线程池适合应用的场合服务器:会收到大量请求实际开发中,需要创建5个以上的线程时,就可以使用线程池。二、创建和停止线程池1....原创 2020-04-26 15:40:26 · 403 阅读 · 0 评论