————————————1.StringBuffer&StringBuilder————————————
String的值是不可变的,每一次对String操作都会生成新的对象,这是对内存的极大浪费
和String不同的是StringBuffer和StringBuilder类的对象能够被多次修改,不产生新的未使用对象
StringBuilder的方法不是线程安全的(不能同步访问) 但速度快
StringBuffer的方法是线程安全的 效率低
————————————2.hashmap1.7和1.8区别———————————————
1.7采用的是头插法,列表+数组
1.8采用的是尾插法,列表+数组+红黑树
————————————3.hashmap和hashtree的区别—————————————
hashmap是线程不安全的,hashtree也是线程不安全的
hashmap输出是无序的,hashtree的输出是有序的
————————————4.线程池的阻塞队列—————————————————
ArrayBlockingQueue(基于数组的阻塞队列,有界队列,按照先进先出(FIFO)的形式)
LinkedBlockingQueue (基于链表的阻塞队列,元素按照先进先出(FIFO)的策略)
————————————5.线程池的重要参数————————————
1.corePoolSize(核心线程数)
--核心线程会一直执行,即使没有任务执行
--当线程数小于核心线程数,有新任务执行时线程池会优先创建新线程(即使有空闲线程也不用)
--设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭
2.BlockingQueue<Runnable>:阻塞队列,存储等待执行的任务。参数有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue可选。
--当核心线程数达到最大时,新的任务会放入等待队列中排队执行
3.maxPoolSize(最大线程数)
--当前线程数>=核心线程数且任务队列已满,就会创建新的线程
--当前线程数=最大线程数,且任务队列已满,线程池会拒绝处理任务抛出异常
4.keepAliveTime(线程空闲时间)
5.TimeUnit:空闲线程的保留时间单位。
--当线程空闲时间=keepAliveTime时,线程会关闭 知道=核心线程数时停止
--allowCoreThreadTimeout=true时,核心线程也会关闭
6.ThreadFactory线程工厂,用来创建线程
7.rejectedExecutionHandler(任务拒绝处理器)
当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务
RejectedExecutionHandler:队列已满,而且任务量大于最大线程的异常处理策略
————————————6.Liunx查看cpu和文件目录命令——————————
top
————————————7.乐观锁和悲观锁————————————————
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。
乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。
MVCC协议版本号:两个隐藏字段,一个是行的创建时间(没开始一个事物,都会自己增加),
一个是删除时间
CAS算法:compare and swap(比较与交换)是一种无锁算法
CAS算法涉及到三个操作数
内存值 V
旧值 A
拟写入的新值 B 当V=A时,将B的值赋给V
————————————8.死锁产生的条件,如何避免死锁——————————
四个必要条件:
1.互斥条件:一个资源一次只能被一个进程占有
2.请求与保持条件:进程在已经持有一个资源的情况下,去请求新的资源,而新资源被其他进程占着,该进程不是释放已拥有的资源
3.不可剥夺条件:进程未使用完资源不能被其他进程强行剥夺
4.循环等待条件:若个进程首位相接循环等待资源
————————————9.虚拟机类加载机制,双亲委派模型,为什么要实现双亲委派模型——————
启动类加载器,扩展类加载器,应用程序加载器
加载一个类的时候会向上层询问是否要加载如果没有就回到最下层加载
————————————10.SpringBoot的启动流程————————————————
每个SpringBoot程序都有一个主入口,也就是main方法,main里面调用SpringApplication.run()启动整个spring-boot程序,该方法所在类需要使用@SpringBootApplication注解,以及@ImportResource注解(if need),@SpringBootApplication包括三个注解,功能如下:@EnableAutoConfiguration:SpringBoot根据应用所声明的依赖来对Spring框架进行自动配置