配色: 字号:
java知识点归纳(面试必备)
2020-11-30 | 阅:  转:  |  分享 
  
知识点整理演讲人2020-11-2901volatilevolatilevolatile变量修饰的共享变量进行写操作是会生成lock汇编指令
将当前处理器缓存的数据行写会内存一个处理器缓存写会内存导致其他处理器缓存失效02原子操作类原子操作类010203原子更新基本类型原
子更新数组原子更新字段类原子操作类原子更新基本类型AtomicBooleanAtomicIntegerAtomicLongAtom
icBoolean原子更新布尔类型原子更新整型12addAndGetcompareAndSet以原子的输入将输入的数值与实例中的数
值相加如果输入的值等于预期值,则以原子的方式将该值设置为输入值34getAndIncrement......以原子方式将当前值加1
使用空循环,获取AtomicInteger中的值,将当期值加1,使用CAS更新AtomicLong原子更新长整型原子操作类原子更
新数组AtomicIntegerArrayAtomicLongArrayAtomicReferenceArrayAtomicInt
egerArray原子更新整型数组中元素AtomicLongArray原子更新长整型整数数组元素AtomicReferenceAr
ray原子更新应用类型数组元素原子操作类原子更新字段类010203AtomicIntegerFieldUpdaterAtomicL
ongFileUpdaterAtomicStampedReferenceAtomicIntegerFieldUpdater原子更新
整型的字段更新器AtomicLongFileUpdater原子更新长整型字段的更新器AtomicStampedReference原
子更新带版本号的应用类型可以解决CAS的ABA问题03多线程多线程线程的优先级线程的状态Daemon线程中断操作线程间通信多线程线
程的优先级操作系统分出一个个时间片,线程会分配到若干时间片,优先级高的分配到的时间片越多9,300Million单击此处添加标题
构建线程的时候通过时间setPriority方法来修改优先级单击此处输入你的正文,文字是您思想的提炼,为了最终演示发布的良好效果,
请尽量言简意赅的阐述观点;根据需要可酌情增减文字,以便观者可以准确理解您所传达的信息。偏重计算的线程设置较低的优先级,频繁阻塞的设
置较高的优先级多线程线程的状态ABCNEWRUNNABLEBLOCKEDDEFWAITINGTIME_WAINTINGTERMIN
ATEDNEW初始状态线程被构建,但未调用startRUNNABLE运行状态将就绪和运行统称为运行中阻塞状态表示线程阻塞与锁进入s
ynchronize等待状态进入该状态表示当前线程需要等待其他线程做出一定动作(中断、唤醒)Lock接口TIME_WAINTING
超时等待可以在指定时间自行返回TERMINATED终止状态多线程Daemon线程一种支持性线程,用于程序中后台调度以及支持性工作T
hread.setDaemon(true)将线程设置为Daemon线程不能依靠finally中的内容确保关闭或者清理资源与非守护线
程区别与非守护线程区别jvm监测到仅剩一个守护线程,而其他用户线程都退出时jvm就会退出,因为没有守护的对象了多线程中断操作表示
一个运行中的线程是否被其他线程进行了中断操作Thread.interrupt对中断标识复位表示一个运行中的线程是否被其他线程进行了
中断操作isInterrupt判断是否被中断BA线程通过检查自身是否被中断来进行响应多线程线程间通信volatile和synchr
onized关键字等待、通知机制Thread.joinThreadLocal等待、通知机制notifywait通知一个在对象上等待
的线程,使其从wait返回是线程进入等待状态,只有等待通知或被中断才会返回,会释放对象的锁3124notifyAllwait(lo
ng)通知所有等待在该对象上的线程超时一段时间,如果没有通知就超时返回Thread.join当前线程A等待thread线程终止后才
从thread.join返回ThreadLocal线程变量是一个以threadLocal对象为键、任意对象为值的存储结构实现原理
Thread的对象都有一个ThreadLocalMap,最终的变量是放在了当前线程的ThreadLocalMap中Thre
adLocalMap中使用的key为ThreadLocal的弱引用,在下一次垃圾回收的时候必然会被清理掉04线程池线程池
010203实现原理ThreadPoolExecutorTutureTask线程池实现原理如果当前运行的线程少于corePoolS
ize,则创建新线程来执行任务如果运行的线程等于或多余corePoolSize,则将任务加入BLockingQueue如果队列已
满,则创建新的线程来处理(需要获取全局锁)如果创建线程超过MaxImumPoolSize,任务将被拒绝,并调用拒绝策略执行线程池
ThreadPoolExecutor0102FixedThreadPoolSingleThreadExecutor0304Cach
edThreadPoolScheduledThreadExecutorFixedThreadPool可重用固定线程数的线程池使用无
界队列LinkedBlockingQuery作为线程池的工作队列当线程池中的线程数到达CorePoolSize后,新任务将在无界
队列中等待,线程数不会超过corePoolSizemaximumPoolSize将是无效参数keepAliveTime将是一个
无效参数不会调用拒绝策略SingleThreadExecutor使用单个WorKer的线程池SingleThreadExecuto
rcorePoolSize和maximumPoolSize都被设置为1实现时,定义了FinalizableDelegatedExe
cutorService包装类实现了finalize方法进行垃圾回收的时候自动shutdown线程CachedThreadP
ool根据需要创建线程的线程池12corePoolSize设置为0,即为空,maximumPoolSzie被设置为Integer.
MAX_VALUE,即无界,keepAliveTimes设置为60L,意味着corePoolSize中的空闲线程等待任务的最长时间
为60秒,超过被终止使用没有容量的SynchronousQueue作为线程池工作队列ScheduledThreadExecutor
给定的延迟之后运行任务,或者定期执行任务使用DelayQueue无界队列作为线程池的工作队列线程池TutureTaskACFutu
reTask可以交给Executor执行实现ExecutorService.submit返回FutureTask实现了Futur
e接口外还实现了Runnable接口DB实现基于AQSReenTrantLock、semaphore、CountDownLatch
都是基于AQS实现子主题FutureTask声明了一个私有的继承于AQS的子类Sync,对FutureTask的调用都委托给这个内
部类05java中的锁java中的锁锁在应用层的优化思路ConditionELockSupport工具DLock(java类)s
ynchronized(JVM层面)CBA0402030501对于普通方法锁的是当前实例对象对于静态同步方法,锁的是当前类的Cla
ss对象java中的锁synchronized(JVM层面)对于同步方法块锁的是Synchonized括号中配置的的对象实现原理
锁的升级实现原理JVM基于进入和退出Monitor对象实现方法同步和代码块同步JAVA对象头ssynchronized锁存在JA
VA对象头MarkWord中存储对象的HashCode、分代年龄、锁标记位偏向锁加锁当线程访问代码块并获取锁时,会在对象头和栈
帧的锁记录中存储偏向锁的线程ID,下次访问时只需简单测试对象头中的线程ID是当前线程ID,则直接获取锁解锁偏向锁不会主动撤销,只
有等到竞争时才会撤销检查对象头中的线程是否存活,如果没有存活那么锁对象被重置为无锁状态,其他线程可以竞争将其设置为偏向锁,如果存活
,那么查看该线程的栈帧信息如果还是需要继续持有这个锁对象那么暂停当前线程1,撤销偏向锁,升级为轻量级锁,如果线程1不再使用该锁对
象,那么将锁对象状态设为无锁状态,重新偏向新的线程轻量级锁加锁JVM在当前栈帧中创建存储锁记录的空间,并将对象头中的markw
ord复制到锁记录中解锁使用CAS将栈帧中的markword替换回对象头,如果成功,则表示没有竞争发生,如果失败则膨胀为重量级
锁锁的升级重量级锁其他线程试图获取锁的操作都会被阻塞java中的锁Lock(java类)212synchronized不具备的特
性实现原理345ReentrantLock(重入锁)公平锁ReentrantReadWriteLock(读写锁)synchroni
zed不具备的特性尝试非阻塞获取锁能够中断获取锁超时获取锁可以选择公平性ABCD队列同步器(AQS)主要方法基础方法可重写方法实
现逻辑同步队列独占式同步状态的获取与释放共享式同步状态的获取与释放独占式超时获取同步状态ReentrantLock(重入锁)判断
当前线程是否为获得锁的线程,如果是,则将同步状态值增加并返回true释放锁时,只有将同步状态修改为0才算释放成功多个hasQue
uedPredecessors判断加入同步队列中的当前节点是否有前驱的判断如果返回ture说明有线程比当前线程更早的获取锁,因此需
要继续等待ReentrantReadWriteLock(读写锁)按位切割使用同步变量,搞16位表示读,低16位表示写java中的锁
LockSupport工具基础方法和wait区别park阻塞当前线程如果调用unpark方法或者当前线程被中断,才会返回基础方法p
arkNanos(longnanos)阻塞当前线程,最长不能超过nanos纳秒基础方法parkUntil(longdeadli
ne)阻塞当前线程,直到deadline时间基础方法unpark唤醒处于阻塞状态的线程和wait区别wait、notify必须保证
wait方法比notify方法先执行,但是park、uppark可以先调用unpark释放一个许可证,后面线程调用park时发现许
可证直接进入休眠wait方法会释放持有的锁,park进入休眠后并不会释放持有的锁park会响应中断,当外部线程对阻塞线程调用int
errupt时,park阻塞线程会立即得到返回java中的锁Condition02实现原理01定义了等待、通知两种类型的方法,与L
ock配合使用实现原理是AQS的内部类等待队列FIFO的队列,每个节点都包含了一个在condition对象上等待的线程引用只保存n
extWaiter,condition拥有首节点和尾节点condition.await该线程释放锁构造成节点加入等待队列并进入等待
状态实现原理Condition.signal唤醒等待队列中等待时间最长的节点,唤醒之前加入同步队列java中的锁锁在应用层的优化思
路减少锁持有时间减少锁粒度锁分离锁粗化CAS减少锁持有时间只有需要时进行同步减少锁粒度ConcurrentHashMap锁分离Li
nkedBlockingQueue实现锁粗化多次加锁合并为一次06并发容器并发容器Frok/Join阻塞队列DConcurrent
LinkedQueueCConcurrentHashMapBA并发容器ConcurrentHashMap结构操作Segment数组
可重入锁为了通过按位与的散列算法定位到Segment数组索引,必须保证Segment数组长度是2的N次方结构HashEntry数组
用于存储键值对数据get不用加锁get方法中使用的变量都定义为volatile通过一次再散列,通过散列运算定位到Segment,
再通过散列算法定位到元素010203put操作共享变量时必须加锁判断是否需要扩容创建一个容量是原来两倍的数组,将原数组元素进行再
散列后插入新的数组中,只对某个Segment定位添加元素的位置,将其放入HashEntry数组非阻塞的线程安全队列结构并发容器C
oncurrentLinkedQueue操作结构由head节点和tail节点组成(tail不一定是尾节点)01每个节点有节点元素和
指向下一个节点的引用组成,节点与节点之间通过next关联,组成一张链表结构的队列02入队列将入队节点设置为当前队列尾节点的下一个节
点更新尾节点(CAS)如果tail节点的next节点不为空,则将入队节点设置为tail节点如果tail节点的next节点为空,将
入队节点设置为tail的next节点操作出队列使用hops变量减少使用CAS更新head节点的消耗并发容器阻塞队列0102分类实现
原理ArrayBolckingQueue由数组结果组成的有界阻塞队列默认不保证公平LinkedBlockingQueue由链表组成
的有界阻塞队列默认和最大程度为Integer.VALUE按照先进先出的原则访问元素PriorityBlockingQueue支持
优先级排序的无界阻塞队列默认情况元素才去自然顺序升序分类DelayQueue使用优先级队列实现的无界阻塞队列分类Synchrono
usQueue不存储元素的阻塞队列分类LinkedTransferQueue链表结果组成的无界阻塞队列分类LinkedBlocki
ngQueue链表结果组成的双向阻塞队列实现原理使用通知模式实现ArrayBlockingQueue使用Condition是实现并
发容器Frok/Join实现原理(使用工作窃取算法)设计BA设计RecursiveAction用于没有返回结果的任务Recurs
iveTask用于有返回结果的任务fork调用ForkJoinWorkerThread.pushTask异步执行pushTask
方法把当前任务放在ForkJoinTask数组队列中实现原理(使用工作窃取算法)join通过调用doJoin方法得到当前任务状态来
判断返回的结果07并发工具类并发工具类CountDownLatchCyclicBarrierCountDownLatch与Cycl
icBarrier区别Semaphore(信号量)Exchanger并发工具类CountDownLatch等待多线程完成等待多线程
完成接入一个int类型的参数,如果想等待N个点完成,就传入N调用countDown方法N就会减1不可能重新初始化或者修改内部计数
器的值,这也是和CyclicBarrier的主要区别并发工具类CyclicBarrier同步屏障CyclicBarrier同步屏障
让一个线程到达一个同步点时被阻塞,知道最后一个线程到达屏障时,所有被屏障拦截的线程才会继续执行01CountDownLatch计
数器只能使用一次,CyclicBarrier可以使用reset重置,如果计算错误,可以重置计数器,重新执行并发工具类02Cycli
cBarrier可以获取阻塞线程的数量CountDownLatch与CyclicBarrier区别03CyclicBarrier提
供一个更高级的函数用于线程到达屏障时,优先处理某业务CountDownLatch与CyclicBarrier区别CountDow
nLatch计数器只能使用一次,CyclicBarrier可以使用reset重置,如果计算错误,可以重置计数器,重新执行1Cyc
licBarrier可以获取阻塞线程的数量CyclicBarrier提供一个更高级的函数用于线程到达屏障时,优先处理某业务23并
发工具类Semaphore(信号量)控制并发线程数Semaphore(信号量)控制并发线程数可以用作流量控制,比如数据库连接并发工
具类Exchanger线程间交互数据Exchanger线程间交互数据提供一个同步点,在这个同步点两个线程可以交换彼此的数据08内存模型内存模型指令重排2014源代码happens-before2015volatile内存语义2016锁的内存语义2017concurrent包实现201809HBaseHBase10ZookeeperZookeeper11设计模式设计模式12KafkaKafka13StormStorm14常用排序算法常用排序算法15elasticsearchelasticsearch16SpringSpring17RedisRedis18MYSQLMYSQL19JVMJVM20hadoophadoop21hivehive22sparkspark23RPC框架实现原理RPC框架实现原理24面试经典题面试经典题25分布式ID生成策略分布式ID生成策略26分布式锁的实现方式分布式锁的实现方式27秒杀系统设计秒杀系统设计28缓存缓存感谢聆听
献花(0)
+1
(本文系职场细细品原创)