
多线程并发
乡村非主流2020
这个作者很懒,什么都没留下…
展开
-
线程同步工具类 2020面试必看
CountDownLatch和CyclicBarrier都有让多个线程等待同步然后再开始下一步动作的意思,但是CountDownLatch的下一步的动作实施者是主线程,主线程等待其他线程,具有不可重复性;而CyclicBarrier的下一步动作实施者还是“其他线程”本身,线程互相等待,具有往复多次实施动作的特点。ConditionCondition是一种广义上的条件队列,它为线程提供了一种更为灵活的等待/通知模式,Condition是一个接口,它的实现ConditionObject是AQS的一个内部原创 2020-07-05 17:33:06 · 129 阅读 · 0 评论 -
ThreadLocal
ThreadLocal是什么ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。从数据结构入手下图为ThreadLocal的内部结构图ThreadLocal结构内部从上面的结构图,我们已经窥见ThreadLocal的核心机制:每个Thread线程内部都有一个Map。 Map里面存储线程本地对象(key)和线程的变原创 2020-07-05 17:32:56 · 423 阅读 · 0 评论 -
Synchronized 关键字原理 2020最新面试必看
一、前言Synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外一篇博客Java:这是一份全面 & 详细的 Sychronized关键字 学习指南从多个方面介绍Synchronize的原理和使用方式等,值得大家阅读。接下来我们正式进入本篇博客的主题。学习Java的小伙伴都知道synchronized关键字是解决并发问题常用解决方案,常用的有以下三种使用方式:修饰代码块,即同原创 2020-06-10 09:45:26 · 205 阅读 · 0 评论 -
高并发系统的架构设计 2020面试必看
高并发的意义其实所谓的高并发,如果你要理解这个问题呢,其实就得从高并发的根源出发,为啥会有高并发?为啥高并发就很牛逼?浅显一点,很简单,就是因为刚开始系统都是连接数据库的,但是要知道数据库支撑到每秒并发两三千的时候,基本就快完了。所以才有说,很多公司,刚开始干的时候,技术比较low,结果业务发展太快,有的时候系统扛不住压力就挂了。当然会挂了,凭什么不挂?你数据库如果瞬间承载每秒5000,8000,甚至上万的并发,一定会宕机,因为比如mysql就压根儿扛不住这么高的并发量。所以为啥高并发牛逼?原创 2020-06-16 09:15:55 · 160 阅读 · 0 评论 -
线程池的重要属性 2020面试必看
线程池的重要属性一个线程池的核心参数有很多,每个参数都有着特殊的作用,各个参数聚合再一起后将完成整个线程池的完整工作。其中的六个尤为重要:线程状态和工作线程的数量,核心线程数和最大线程数,创建线程的工厂,缓存任务的阻塞队列,非核心线程存活的时间和拒绝策略。线程状态和工作线程数量首先线程池是有状态的,在不同的状态下,线程池的行为是不一样的。然后线程池肯定是需要线程去执行具体的任务,所以在线程池中就封装了一个内部类Worker作为工作线程,每个Worker中都维持着一个T...原创 2020-06-16 09:15:43 · 311 阅读 · 0 评论 -
创建线程的三种方法 2020面试必看
第一种方法:继承Thread类,重写run()方法,run()方法代表线程要执行的任务。第二种方法:实现Runnable接口,重写run()方法,run()方法代表线程要执行的任务。第三种方法:实现callable接口,重写call()方法,call()作为线程的执行体,具有返回值,并且可以对异常进行声明和抛出使用start()方法来启动线程优点:因为JAVA是单继承机制,当我们继承Thread类后就不能继承其他类了,所以选用实现Runnable接口。1.通过实现Runnable接口来创建Thre原创 2020-06-16 09:15:30 · 156 阅读 · 0 评论 -
几个线程池相关问题 2020面试必看
1.说一说往线程池里提交一个任务会发生什么?如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;2.线程池.原创 2020-06-16 09:15:15 · 191 阅读 · 0 评论 -
如何设计一个动态大小的线程池 2020面试必看
·什么是线程池?·线程池是管理线程对象的容器,将任务提交到线程池后,线程池会使用线程池中的线程来执行任务,线程使用完毕后不需要销毁而是放回池中,从而可以减少创建和销毁线程对象的开销。·如何设计一个动态大小的线程池,应该有哪些方法?·一个线程池包括以下四个基本组成部分:00001.线程池管理类(ThreadPool):用来创建线程,销毁线程,添加新任务等。00002.工作线程(PoolWorker):线程池中的线程,在没有任务时处于等待状态,可以循环的执行任务。00...原创 2020-06-16 09:15:02 · 298 阅读 · 0 评论 -
线程的五种状态 2020面试必看
线程共包括以下5 种状态:1. 新建状态(New):线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2. 就绪状态(Runnable):也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。3. 运行状态(Running):线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。4....原创 2020-06-16 09:14:34 · 128 阅读 · 0 评论 -
ThreadPoolExecutor 2020面试必看
ThreadPoolExecutor机制一、概述1、ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务;2、Executors方法提供的线程服务,都是通过参数设置来实现不同的线程池机制。3、先来了解其线程池管理的机制,有助于正确使用,避免错误使用导致严重故障。同时可以根据自己的需求实现自己的线程池二、核心构造方法讲解下面是ThreadPoolExecutor最核心的构造方法...原创 2020-06-08 09:32:59 · 173 阅读 · 0 评论 -
【ThreadLocal】
1. 背景ThreadLocal源码解读,网上面早已经泛滥了,大多比较浅,甚至有的连基本原理都说的很有问题,包括百度搜索出来的第一篇高访问量博文,说ThreadLocal内部有个map,键为线程对象,太误导人了。ThreadLocal非常适合对Java多线程编程感兴趣的程序员作为入门类阅读,原因两方面: 加上注释源码也不过七八百行。 结构清晰,代码简洁。 本文重点导读ThreadLocal中的嵌套内部类ThreadLocalMap,对ThreadLocal本身API的介绍简略带过原创 2020-06-08 09:32:43 · 240 阅读 · 0 评论 -
AQS 2020面试必看
谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。这里..原创 2020-06-08 09:32:23 · 143 阅读 · 0 评论 -
Unsafe与CAS 2020面试必看
Unsafe与CASUnsafe简单讲一下这个类。Java无法直接访问底层操作系统,而是通过本地(native)方法来访问。不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作。这个类尽管里面的方法都是public的,但是并没有办法使用它们,JDK API文档也没有提供任何关于这个类的方法的解释。总而言之,对于Unsafe类的使用都是受限制的,只有授信的代码才能获得该类的实例,当然JDK库里面的类是可以随意使用的。从第一行的描述可以了解到Unsafe原创 2020-06-08 09:25:01 · 183 阅读 · 0 评论 -
深入解析Java AtomicInteger 原子类型 2020面试必看
Java开发中不可避免的会遇到并发的问题。在进行并发编程的时候我们需要确保程序在被多个线程并发访问时可以得到正确的结果,也就是要实现线程安全。那么什么样的标准可以称为线程安全呢?这里有线程安全的定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的。举一个线程不安全的小例子。假如我们想实现一个功能来统计网页访问量,首先我们可能想到用count++的方法来统计访问.原创 2020-06-08 09:24:46 · 196 阅读 · 0 评论 -
synchronized性能优化(JVM团队) 2020最新解析
前言在JDK 1.6 之前,synchronized 性能令人担忧,但是 1.6 之后,JVM 团队针对 synchronized 做了很多的优化,让 synchroized 在性能层面相比较 ReentrantLock 不相上下。那么,JVM 团队做了哪些优化呢?首先说,怎么才能优化?我们知道,“锁” 其实是互斥同步的具体实现,而互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要用户态转到内核态来完成。这些操作给系统的并发性能带来了很大的压力。所以,优化的方向就是减少线程的阻原创 2020-06-08 09:24:20 · 544 阅读 · 0 评论 -
synchronized 原理 基本规则 2020最新
1. synchronized原理在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问。例如,现在有两个线程A和线程B,它们都会访问“对象obj的同步锁”。假设,在某一时刻,线程原创 2020-06-05 10:38:47 · 212 阅读 · 0 评论 -
juc并发工具包中各种锁 2020最新
一.java中的锁根据加入Java中的时间,Java中的锁,可以分为"同步锁"和"JUC包中的锁"。同步锁 即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁。Java 1.0版本中就已经支持同步锁了。 同步锁的原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。但是,在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU调度,从而在CPU上执行;而没有获取到同步锁的线程,必须进行等待,直到获取到同步锁之原创 2020-06-05 10:36:08 · 252 阅读 · 0 评论