个人java 总结
1.java 数据结构
java主要数据结构:
1.1Collection
- -List
- —ArrayList
- —LinkedList
- —Vector(线程安全)
- —–Stack 只有栈顶一端进出(先进后出)
(并发) 1.CopyOnWriteArrayList
- -Set
- —HashSet
- —LinkedHashSet
-
—TreeSet
- -Queue 队列,一端进另一端出(先进先出)
- —Deque 双端队列,两端都可以进出
(并发)
- BlockingQueue
- -ArrayBlockingQueue
- -LinkedBlockingQueue
- -PriorityBlockingQueue
- -SynchronousQueue
1.2Map
- -HashMap
- -HashTable(线程安全)
- -LinkedHashMap
- -TreeMap
(并发)
- ConcurrentHashMap
分段锁segment
2.并发,多线程
2.1ThreadPoolExecutor
jdk自带线程池,参数:核心线程池大小,最大线程池大小,任务队列,超时时间,时间单位,线程工厂,拒绝handler
- corePoolSize 核心线程池大小
- maximumPoolSize 最大线程池大小
- keepAliveTime 线程池中超过corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间
- TimeUnit keepAliveTime时间单位
- workQueue 阻塞任务队列
- threadFactory 新建线程工厂
- RejectedExecutionHandler 当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理
主要机制:
- 当线程数小于核心线程池,新提交的任务会新建一个线程执行任务,即使存在空闲线程。
- 当线程数大于核心线程池,新提交的任务会被放在队列中国呢,等待线程池任务调度执行
- 当队列已满,最大线程数量大于线程数量时,新提交的任务会新创建线程执行任务。
- 当线程池数量大于最大线程数量,新提交的任务由RejectedExecutionHandler处理
- 当线程池大于核心线程数量,线程的空闲时间达到keepAliveTime时,关闭空闲线程。
- 当设置allowCoreThreadTimeOut为true时,线程池中的核心线程空闲时间达到keepAliveTime时,也会关闭线程。
2.2Lock
1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
5)Lock可以提高多个线程进行读操作的效率。
示例:
Lock lock = ...;
if (lock.tryLock()) {
try {
// manipulate protected state
} finally {
lock.unlock();
}
} else {
// perform alternative actions
}
ReadWriteLock
一个用来获取读锁,一个用来获取写锁。也就是说将文件的读写操作分开,分成2个锁来分配给线程,从而使得多个线程可以同时进行读操作。下面的ReentrantReadWriteLock实现了ReadWriteLock接口。
ReentrantLock ReentrantReadWriteLock
“可重入锁”
2.3volatile
volatile 变量强制线程每次读取的时候都直接从主内存中读取,同时,每次写 volatile 变量的时候也要立即刷新主内存中的值。
volatile可以保证内存的可见性和有序性
- 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
- 2)禁止进行指令重排序。
volatile关键字禁止指令重排序有两层意思:
1)当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行;
2)在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行。
volatile的原理和实现机制
前面讲述了源于volatile关键字的一些使用,下面我们来探讨一下volatile到底如何保证可见性和禁止指令重排序的。
“观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”
lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:
1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
2)它会强制将对缓存的修改操作立即写入主存;
3)如果是写操作,它会导致其他CPU中对应的缓存行无效。
2.4ThreadLocal
一种线程封闭技术,ThreadLocal为变量在每个线程保存一个副本,每个线程访问自己的内部变量。
应用场景:当很多线程需要多次使用同一个对象,并且需要该对象具有相同初始化值的时候最适合使用ThreadLocal。
最常见的ThreadLocal使用场景为 用来解决数据库连接、Session管理
3.JVM
3.1JMM java内存模型
运行时数据区域
程序计数器
程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
Java虚拟机栈
与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。
局部变量、对象引用(reference类型)在Java虚拟机规范中,对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常
本地方法栈
本地方法栈(Native Method Stacks)则是为虚拟机使用到的Native方法服务。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。
Java堆
Java堆是被所有线程共享的一块内存区域,Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间等。如果从内存分配的角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。
方法区
方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
运行时常量池
运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
直接内存
直接内存并不是JVM管理的内存,可以这样理解,直接内存,就是JVM以外的机器内存,比如,你有4G的内存,JVM占用了1G,则其余的3G就是直接内存,JDK中有一种基于通道(Channel)和缓冲区(Buffer)的内存分配方式,将由C语言实现的native函数库分配在直接内存中,用存储在JVM堆中的DirectByteBuffer来引用。由于直接内存收到本机器内存的限制,所以也可能出现OutOfMemoryError的异常。
3.2GC
垃圾回收算法
4.分布式
4.1负载均衡
4.2集群模式
4.3异步
4.4一致性hash
4.5一致性 –一致性算法 –一致性原理
5.java网络通信
TCP/IP
UDP
BIO
NIO
Netty
6.设计和架构
设计模式
微服务
SOA
分层
7.中间件
7.1数据库
mysql db2
7.2缓存
redis
7.3消息队列
Kafaka
ElasticSearch
8.开源框架
8.1Spring
spring核心思想是IOC和AOP
先谈控制反转(Inversion of Control ),是指对象的控制不是自己管理,而是交给第三方,他是一种依赖倒置原则的一种设计。IOC又叫DI(依赖注入Dependency Injection),所谓依赖注入,就是把底层类作为参数传入上层类,实现上层类对下层类的“控制”。 从另一个角度看,spring ioc是可以做到:两方的依赖不由两者来决定,而是交给第三方,让第三方来管理资源(也就是bean)的相互依赖关系。这样一是对所有资源进行统一管理,统一分配。
–SpringMVC –Spring-boot
8.2Sofa
–Sofa-bolt
–Sofa-rpc
8.3Dubbo
9.大数据
HBase Spark Yarn Zookeeper Hive