java
data=socket.read()
阻塞IO:当用户线程访问时,发现没有准备就绪,在等待,cpu去做其他的事情。
非阻塞IO:当用户线程访问时,发现没有准备就绪,就再去发起请求,cpu一直占用。
JAVA NIO:Channel(管道) Buffer(缓冲区) Selector
IO:面向流
NIO:面向缓冲区
加载、
验证、
准备、 符号引用 直接引用 初始化 类构造器
解析、
初始化
类加载器 启动加载器 扩展加载器 应用程序加载器
双亲委派
OSGI
集合类:java.util主要分为三种:set list(queue) map
collection:collection是集合set、list、queue的基本接口
iterator:迭代器,可以通过迭代器遍历集合中的数据
map:是映射表中的基础接口
集合框架:collection map
collection: set list queue
map:hashmap hashtable treemap
set:hashset treeset linkhashset
list:arraylist vector linkedlist
queue:queue
list是有序的collection
ArrayList数组 适合遍历查找,适合插入和删除。
Vector数组实现、线程同步 ,一个时刻只能有一个线程进行写vector
linkedlist链表 链表的存储结构,适合插入和删除。
set无序的 但是值不能重复。
如果想要让两个不同的对象视为相等的,就必须覆盖Object的hashCode方法和equals方法。
hashSet:hashcode相同,equals为true,为同一个值。 hashcode不同,存一行。 hashcode相同,equals不同,存一列。
treeSet:二叉树的原理。Integer和String对象都可以进行默认的TreeSet排序,而自定义类的对象是不可以的,自己定义的类必须实现Comparable接口,并且覆写相应的compareTo()函数,才可以正常使 用
linkedhashSet:hashset linkedhashmap
map
hashMap:数组+链表+红黑树
hashtable:线程安全
treemap:可排序
linkedhashmap:记录插入的顺序
thread start()方法是一个native方法
runnable
新建NEW
就绪RUNNABLE
运行RUNNING
阻塞BLOCKED--等待阻塞、同步阻塞、其他阻塞
死亡DEAD--正常结束、异常结束、stop会导致死锁
乐观锁 读多写少 CAS
悲观锁 写多 Synchronized
自旋锁
reentantlock 集成了lock,是可重入锁,提供了诸如可响应中断锁、可轮询锁请求、定时锁等 避免多线程死锁的方法。
非公平锁
可重入锁:递归锁。
ReadWriteLock:读写锁
读的时候多个人读。不能写。读锁。
写的时候一个人写,不能读。写锁。
Java 中读写锁有个接口 java.util.concurrent.locks.ReadWriteLock ,也有具体的实现 ReentrantReadWriteLock。
共享锁、独占锁
重量级锁 这种依赖于操作系统 Mutex Lock 所实现的锁我们称之为 “重量级锁”
锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。
轻量级锁:
线程相关的基本方法有wait,notify,notifyAll,sleep,join,yield等。
1. sleep():强迫一个线程睡眠N毫秒。
2. isAlive(): 判断一个线程是否存活。
3. join(): 等待线程终止。
4. activeCount(): 程序中活跃的线程数。
5. enumerate(): 枚举程序中的线程。
6. currentThread(): 得到当前线程。
7. isDaemon(): 一个线程是否为守护线程。
8. setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线 程依赖于主线程结束而结束)
9. setName(): 为线程设置一个名称。
10. wait(): 强迫一个线程等待。
11. notify(): 通知一个线程继续运行。
12. setPriority(): 设置一个线程的优先级。
13. getPriority()::获得一个线程的优先级。
线程的上下文切换:任务的状态保存及再加载, 这段过程就叫做 上下文切换。
线程池主要特点为:线程复用;控制大并发数;管理线程。
一般的线程池主要分为以下4个组成部分:
1. 线程池管理器:用于创建并管理线程池
2. 工作线程:线程池中的线程
3. 任务接口:每个任务必须实现的接口,用于工作线程调度其运行
4. 任务队列:用于存放待处理的任务,提供一种缓冲机制
Java 中的线程池是通过 Executor 框架实现的,该框架中用到了 Executor,Executors, ExecutorService,ThreadPoolExecutor ,Callable和Future、FutureTask这几个类
Java中的阻塞队列:
1. ArrayBlockingQueue :由数组结构组成的有界阻塞队列。
2. LinkedBlockingQueue :由链表结构组成的有界阻塞队列。
3. PriorityBlockingQueue :支持优先级排序的无界阻塞队列。
4. DelayQueue:使用优先级队列实现的无界阻塞队列。
5. SynchronousQueue:不存储元素的阻塞队列。
6. LinkedTransferQueue:由链表结构组成的无界阻塞队列。
7. LinkedBlockingDeque:由链表结构组成的双向阻塞队列。
CountDownLatch(线程计数器 )
CyclicBarrier(回环栅栏-等待至barrier状态再全部同时执行)
Semaphore(信号量-控制同时访问的线程个数)
volatile 变量可见性 禁止重排序
java反射API:
1. Class类:反射的核心类,可以获取类的属性,方法等信息。
2. Field类:Java.lang.reflec包中的类,表示类的成员变量,可以用来获取和设置类之中的属性 值。
3. Method类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或 者执行方法。
4. Constructor类: Java.lang.reflec包中的类,表示类的构造方法
获取Class对象的3种方法
Person p=new Person();
Class clazz=p.getClass();
Class clazz=Person.class;
Class clazz=Class.forName("类的全路径"); (常用)
Annatation(注解)是一个接口
@Target说明了Annotation所修饰的对象范围: Annotation可被用于 packages、types(类、 接口、枚举、Annotation 类型)、
类型成员(方法、构造方法、成员变量、枚举值)、方法参数 和本地变量(如循环变量、catch参数)。
在Annotation类型的声明中使用了target可更加明晰 其修饰的目标
@Retention 定义了该Annotation被保留的时间长短:表示需要在什么级别保存注解信息,
用于描 述注解的生命周期(即:被描述的注解在什么范围内有效),
取值(RetentionPoicy)由:
SOURCE:在源文件中有效(即源文件保留)
CLASS:在class文件中有效(即class保留)
RUNTIME:在运行时有效(即运行时保留)
@Documented描述-javadoc
@Documented用于描述其它类型的 annotation 应该被作为被标注的程序成员的公共 API,因此可以被例如javadoc此类的工具文档化。
@Inherited 元注解是一个标记注解,@Inherited 阐述了某个被标注的类型是被继承的。
如果一 个使用了@Inherited 修饰的 annotation 类型被用于一个 class,则这个 annotation 将被用于该 class的子类
静态内部类 hashmap entry
成员内部类
局部内部类(定义在方法中的类)
匿名内部类(要继承一个父类或者实现一个接口、直接使用new来生成一个对象的引用)
Spring的特点:
轻量级
控制反转
面向切面
容器
框架集合
Bean 定义了 5 中作用域,分别为 singleton(单例)、prototype(原型)、 request、session和global session
AOP 把软件系统分为两个部分:核心关注点和横切关注点
AOP主要应用场景有:
1. Authentication 权限
2. Caching 缓存
3. Context passing 内容传递
4. Error handling 错误处理
5. Lazy loading 懒加载
6. Debugging 调试
7. logging, tracing, profiling and monitoring 记录跟踪 优化 校准
8. Performance optimization 性能优化
9. Persistence 持久化
10. Resource pooling 资源池
11. Synchronization 同步
12. Transactions 事务
AOP核心概念:
1、切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
2、横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。
3、连接点(joinpoint):被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
4、切入点(pointcut):对连接点进行拦截的定义
5、通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、 异常、终、环绕通知五类。
6、目标对象:代理的目标对象
7、织入(weave):将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法 或字段。
Spring 提供了两种方式来生成代理对象: JDKProxy 和 Cglib
SpringBoot特点:
创建独立的Spring应用程序
嵌入Tomcat,无需部署war文件
简化Maven配置
自动配置Spring
提供生产就绪型功能
绝对没有代码生成和对XML没有要求配置
事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性 ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )
Java 事务编程接口(JTA:Java Transaction API)和 Java 事务服务 (JTS;Java Transaction Service) 为 J2EE 平台提供了分布式事务服务。
分布式事务(Distributed Transaction)包括事务 管理器(Transaction Manager)和一个或多个支持 XA 协议的资源管理器 ( Resource Manager )。
我们可以将资源管理器看做任意类型的持久化数据存储;事务管理器承担着所有事务 参与单元的协调与控制
两阶段提交:第一阶段:准备阶段;第二阶段:提交阶段。
Mybatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。
一级缓存 是指 SqlSession 级别的缓存,当在同一个 SqlSession 中进行相同的 SQL 语句查询时,
第二次以 后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存多缓存1024条SQL。
二级缓存 是指可以跨 SqlSession 的缓存。是 mapper 级别的缓存,对于 mapper 级别的缓存不同的 sqlsession是可以共享的
一级缓存:
key:MapperID+offset+limit+Sql+所有的入参
二级缓存(mapper基本)
1.Mybatis全局配置中启用二级缓存配置
2. 在对应的Mapper.xml中配置cache节点
3. 在对应的select查询节点中添加useCache=true
物理层
数据链路层
网络层
传输层
会话层
表示层
应用层
TCP/IP
网络访问层
网络层
传输层
应用层
3次握手4次挥手