复习
文章平均质量分 77
丿沐染烟忱丶
昨夜西风凋碧树,独上高楼,望尽天涯路!
衣带渐宽终不悔,为伊消得人憔悴!
众里寻他千百度。蓦然回首,那人却在灯火阑珊处!
展开
-
AQS(AbstractQueuedSynchronizer)
前置知识公平锁和非公平锁、可重入锁、LockSupport、自旋锁、数据结构之链表、设计模式值模板设计模式。是什么字面意思是抽象的队列同步器。源代码结构AbstractQueuedSynchronizer简称AQS。技术解释它是用来构建锁或者其他同步器组件的重量级基础框架及整个JUC体系的基石,通过内置的FIFO队列来完成线程获取资源的排队工作,并通过一个int类型变量表示持有锁的状态。大致意思就是:当某个线程抢占锁资源后,其他线程被阻塞,这些被阻塞的线程怎么才能更好的管理呢?就是通过原创 2021-08-20 16:52:29 · 277 阅读 · 0 评论 -
LockSupport
是什么LockSupport用于创建锁和其他同步类的基本线程阻塞原语。LockSupport中的park()和unpark()的作用分别是阻塞线程和唤醒阻塞线程。3中让线程等待和唤醒的方法方式1:使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程。方式2:使用JUC包中的Condition的await()方法让线程等待,使用signal()方法唤醒线程。方式3:LockSupport类的park方法阻塞线程,unpark方法唤醒线程。Obje原创 2021-08-20 15:10:45 · 204 阅读 · 0 评论 -
String中的intern()方法
案例此案例是《深入理解java虚拟机》中的一个案例。package javase;public class StringPool58Demo { public static void main(String[] args) { String str1 = new StringBuilder("ha").append("llo").toString(); System.out.println(str1); System.out.println(原创 2021-08-19 11:37:19 · 574 阅读 · 0 评论 -
强、软、弱、虚引用
整体架构强引用当内存不足,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收。强引用是最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还活着,垃圾收集器不会碰这种对象。在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到,JVM也不会回收。因此强引用是造成Java内存泄漏的主要原因之一。对于一个普通的对象,如果没有原创 2021-08-17 14:35:01 · 105 阅读 · 0 评论 -
死锁编码与定位
概念死锁是指两个或两个以上的进程在执行的过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉,那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。package juc;import java.util.concurrent.TimeUnit;class HoldLockThread implements Runnable{ private String lockA; private Stri原创 2021-08-16 14:12:20 · 93 阅读 · 0 评论 -
线程池复习
为什么用线程池,优势。线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。它的主要特点为:线程复用;控制最大并发数;管理线程。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会原创 2021-08-13 16:51:38 · 114 阅读 · 1 评论 -
阻塞队列以及生产者消费者案例
阻塞队列,顾名思义,首先是一个队列,而阻塞队列在数据结构中所起的作用是:线程1向队列添加元素,线程2从队列取元素。当阻塞队列是空时,从队列取元素的操作会被阻塞。当阻塞队列满时,向队列添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加元素的线程也会被阻塞,直到其他线程从队列中移除一个或者多个元素或者完全清空队列后使队列重新变得空闲起来并后续新增。在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦原创 2021-08-12 14:10:31 · 106 阅读 · 0 评论 -
CountDownLatch/CyclicBarrier/Semaphore
CountDownLatch让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。该类主要的两个方法是await()、countDown()。调用await()的方法的线程会进入阻塞状态,其他调用countDown()方法,会使计数器减一,直到减为0,被阻塞的线程才会继续运行。案例一放学后需要一个人最后走负责锁门,那么这个人就需要等待其他同学都走后才会锁门。不加CountDownLatchpackage juc;import java.util.concurrent.CountDownLat原创 2021-08-11 14:25:39 · 96 阅读 · 0 评论 -
独占锁(写锁)/共享锁(读锁)/互斥锁
理论独占锁:指该锁一次只能被一个线程所持有。对于ReentrantLock和Synchronized而言都是独占锁。共享锁:该锁可以被多个线程所持有。对于ReentrantReadWriteLock来说,其读锁是共享锁,写锁是独占锁。读锁的共享锁可保证并发读是非常高效的,读写,写读,读读的过程是互斥的。代码验证加锁前:package locks;import java.util.HashMap;import java.util.Map;import java.util.concurrent原创 2021-07-29 17:06:42 · 1794 阅读 · 0 评论 -
公平锁/非公平锁/可重入锁/递归锁/自旋锁
公平和非公平锁公平锁:是指多个线程按照申请锁的顺序获取锁。先来后到。非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,在高并发下,有可能会造成优先级反转或者饥饿现象。非公平锁的优点在于吞吐量比公平锁大。ReentrantLock默认是非公平锁Lock lock = new ReentrantLock();public ReentrantLock() { sync = new NonfairSync(); }其有原创 2021-07-28 17:42:40 · 201 阅读 · 0 评论 -
集合类不安全的问题
ArrayList当我们构造一个ArrayList的时候,会为我们创建一个初始容量为10的空列表。/** * Constructs an empty list with an initial capacity of ten. */ //构造一个初始容量为 10 的空列表 public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }可以看到,eleme原创 2021-07-28 15:04:26 · 135 阅读 · 0 评论 -
ABA问题
引言CAS的缺点包括循环判断真实值和主内存的值时会使CPU资源损耗大、只能对一个共享变量执行CAS、ABA问题。CAS算法实现的一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差类会导致数据的变化。比如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且线程two进行了一些操作将值变成了B,然后线程two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,但实际上是发生了变化。尽管线程one的CAS操作成功,但是不代表这原创 2021-07-28 10:40:01 · 144 阅读 · 0 评论 -
CAS底层原理
CAScas(比较与替换)。源码:/** * Atomically sets the value to the given updated value * if the current value {@code ==} the expected value. * * @param expect the expected value * @param update the new value * @return {@code true} if原创 2021-07-27 17:08:58 · 309 阅读 · 0 评论 -
volatile
volatilevolatile:是jvm提供的一种轻量级的同步机制 它保证了可见性和禁止指令重排序,但不保证原子性。JMM:java内存模型,是一种抽象概念,是一种规范。JMM同步规范: 1.解锁前,线程必须将值刷新回主内存。2.加锁前,线程必须将主内存变量的最新值读到工作内存。3.加锁解锁是同一把锁。主内存与工作内存: jvm程序运行的实例是线程,线程被创建时,jvm会为每个线程分配一个属于自己的工作内存空间,是线程私有的区域。而主内存是线程共享的区域。主内存中的变量为线程共享,当多线原创 2021-07-27 14:40:18 · 83 阅读 · 0 评论 -
复习篇spring(一)
Spring简介Spring是一个包含了多种框架的集合,例如:Spring framework、SpringMVC、SpringBoot、SpringCloud等,故而又称Spring全家桶。而我们平时所用的Spring框架就是Spring framework。Spring是一种分层的一站式轻量级开源框架,以Ioc(Inverse of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为核心。其中Ioc就是将对象的创建权交由Spring去创建原创 2021-07-14 16:25:25 · 92 阅读 · 0 评论 -
复习记录一:MapReduce
介绍MapReduce的核心思想是“分而治之”,,适用于大量复杂的任务处理场景。Map负责“分”,即把复杂的任务分解为若干个小任务来并行处理,可以进行拆分的前提是这些小任务可以可以并行计算,彼此之间没有依赖关系。Reduce负责“合”,即对Map阶段的结果进行汇总。MapReduce运行在yarn集群。1.ResourceManager。2.NodeManager。MapReduce编程规范Map阶段2个步骤设置InputFormat类,将数据切分成键值对,输入到第二步。自定义Ma原创 2020-07-07 17:28:58 · 110 阅读 · 0 评论 -
复习记录一:HDFS的高可用
组件zkfc是基于Zookeeper的故障转移控制器,负责控制NameNode的主备切换。zkfc会监测NameNode的健康状况,当发现Active NameNode出现故障时,会通过Zookeeper进行一次新的选举,完成active和standby的切换。HealthMonitor周期性调用NameNode的HAServiceProtocol RPC,监控NameNode的健康状况,并向zkfc进行反馈。ActiveStandbyElector接收zkfc的选举请求,通过Zookeepe原创 2020-07-07 14:41:25 · 105 阅读 · 0 评论 -
复习记录一:HDFS元数据管理
fsimage和edits在HDFS集群中,NameNode的元数据都保存在了fsiamge和edits当中。这两个文件就记录了所有的元数据信息。editsedits存放了客户端最近一段时间的操作记录日志。客户端对HDFS进行写文件时,会首先被记录到edits中。edits修改时元数据也会更新。fsimageNameNode中关于元数据的镜像,一般都称为检查点,fsimage存放了一份比较完整的元数据信息。SecondaryNameNode的合并操作为了防止edits文件过大,Se原创 2020-07-07 14:07:21 · 175 阅读 · 0 评论 -
复习记录一:hdfs的文件写入读取过程
文件写入过程1.Client会向namenode发出上传请求。2.namenode检测上传的权限。3.namenode通知Client可以上传。4.Client请求上传整个文件的其中一个数据块。5.namenode会根据集群中DN上的block信息和机架感知,选出可以上传的3个主机6.namenode返回datanode列表给Client。7.client和DN之间建立pipeline(管道:以便于传输数据)。8.Client向DN传递数据,传递的单位为:packet(64k)。9.将pa原创 2020-07-06 21:55:33 · 168 阅读 · 0 评论 -
复习记录一:hdfs的副本机制与机架感知
副本机制HDFS存储文件时,会将文件切分成一个一个的块(Block),默认是一个块为128M(1.x为64M),也可以在hdfs配置文件中进行设置。作用可以解决当文件大于一个机器的磁盘存不下的问题使用块作为文件的存储单位,可以简化存储子系统块非常适合数据备份,提高了数据的容错能力机架感知告诉当前节点所在的主机属于哪个机架。副本的存放策略:第一个副本存到本机第二个副本存入到和本机同一个机架的其他机器中第三个副本存到其他的机架中的主机中...原创 2020-07-06 18:59:03 · 154 阅读 · 0 评论 -
复习记录一:Hadoop
分布式:服务间出现跨机器、跨进程统称为分布式。HDFS:分布式存储系统,解决海量数据的存储问题。Map Reduce:分布式计算框架,基于磁盘进行迭代计算。第一代计算框架HDFS组件:NameNode:使用内存存储集群中的元数据。DateNode:负责响应客户端对数据块的读写请求,向NameNode汇报自身状态信息。Block:是HDFS切分文件的尺度,默认是128M。副本因子:HDFS为了防止数据丢失,允许对其进行备份,最多为3个。组件作用:Client:客户端文件切分。文件上传H原创 2020-07-06 18:34:25 · 139 阅读 · 0 评论