原文参考 .html
静态多态:
动态多态:
栈:存储局部变量/动态链接/出口,线程私有
堆:主要存储对象,线程共享
内存机制:java运行时内存区域:数据:堆,虚拟机栈指令: 程序计数器,本地方法栈java内存模型:逻辑内存模型:主内存-->线程内存之间的数据交换方式,线程内存读取主内存数据 然后操作,操作完后写入主内存,和硬件的数据存储模型类似物理内存模型: 即堆栈,栈 随线程生随线程死,堆线程数据共享,所以重点研究,年轻代/老年代/方法区 eden/s0/s1
wait() Object的方法 释放锁/CPU时间片 等待唤醒sleep() Thread的方法 阻塞 不会释放锁/CPU时间片just等一会
java单继承多实现机制,使用接口更加便于拓展但抽象类有一个好处,就是适合模板方法
Override重写:重新编写,即实现或者覆盖接口或者抽象类的方法,动态多态,运行时会解析栈区的动态链接,确认调用具体实现类的方法 Overload重载:重新载入,即同一个方法名不同的参数(不包括返回值,因为方法签名不包含返回值), 可以理解为静态多态,类装载时会对字面量解析成具体的方法
hashcode:hash算法需要这个作为依据,比如hashMap,hashSetequal:一般要求equal相同的情况下 hashcode也需要相同
强引用:最常见的引用,比如Object o = new Object();软引用:WeakhashMap,便于内存回收,当key为null时 自动回收内存
equals/toString/clone/getClass 每个对象的基础方法
wait/notify/notifyall 监视器方法
1.7以后可以,语法糖,编译后仍旧使用的string的hashcode值
进程:一个tomcat启动就是一个进程
线程:进程更细一步的划分 CPU调度的最小单位
数据库事务的四大特性ACID
A原子性 不会是数据库操作的中间态
C一致性 业务上的 比如转账后的两个账户的总额是一致的
I隔离性 读未提交 脏读读已提交 不可重复读 可能同一事务两次读取读到的数据不一样 可重复读 幻读 INNOdb 可能是通过缓存 让两次查询数据一样 但如果本事务中做更新操作 却会更新到其他事务已提交的数据串行 效率慢不同隔离级别都会有一定的问题,数据严重程度 脏读>不可重复度>幻读有脏读的问题就有不可重复度 幻读的问题
D持久性 提交了就会持久的保存在数据库中
竞争资源
循环 持续的相互等待解决死锁:a.顺序加锁解锁解决相互等待 b.设置超时 解决持续等待
即采用一种乐观锁的思想,认为绝大多数操作都是读数据,所以
对读不采用任何的同步操作,保证读操作的效率,
而针对写操作,直接完全不干涉读操作,复制原有的数组,并操作原有数据,最后再将新数组赋值给旧数组,通过lock加锁保证写操作的线程安全性
存在的问题就是数据的一致性,可能有延迟(即读的可能不是最新的数据) 但能保证数据的最终一致性
适用于读远大于写的操作,比如缓存
ExcutorServcie pool = new ExcutorService(coreSize,maxSize,bolckQuene,拒收策略)
一代新人胜旧人,verctor老版本的同步arrayList,
现在线程安全一般都使用Collections.synchronizedList,CopyOnWriteArrayList
hashMap:线程不安全,数组+链表+红黑树
ConcurrentHashmap:线程安全
LinkedhashMap:线程不安全 hashmap子类,
功能上的区别:
Filter:主要目的是用于拦截是否处理
Servlet:主要处理业务,
个人觉得Filter和Servlet的关系有点类似Aop和业务的关系,抽取共同的功能进行统一处理 比如字符 鉴权生命周期的区别:
Servlet:容器启动加载配置的Servlet,调用init,使用中调用doService(),容器销毁destory
Filter:容器启动时加载配置的filter,使用中doFilter()
ORM框架,关注重点在于xml,其作用是便于与数据库交互,主要通过xml的方式,
是对jdbc的封装
其整个原理比较简单,SqlSessionBulider->SqlSessionFactory-->SqlSesion-->(getMapper)-->commit
Sqlsession是核心,包含了执行器,配置文件,事务等
切面
编程式TranctionTempleta
声明式@transactional
要实现分布式session,两个方式:
1.同一用户或id访问的一直都是同一台服务器可以利用cookiesession粘连负载均衡算法(可能得手写),比如通过zuul的过滤器,分布式的每台服务器一个serviceId,计算出一个值,放入cookie中
2.session的数据公共比如redis单点登陆是利用coolie记录tooken 而tooken通过一个公共的服务可以查到数据
如果没有session,交互时数据全在cookied上,太多不安全,于是cookied通过一个key(jsessionid)指定一个session,然后将这部分数据存在服务器
所以session是cookied的拓展,
Session数据在服务器 设置超时默认是半小时
Cookie数据在浏览器,浏览器 需要加密
//有一个内部类ThreadLocalMap 参照hashmap实现
//但其中的entry采用的是WeakReference
class ThreadLocal<T>{public void set(T value){//以当前线程为keyThread key = Thread.currentThread();ThreadLocalMap map = getMap(t);if(map != null){map.set(key,value);}}static class Entry extends WeakReference<ThreadLocal<?>> {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}}
}
本文发布于:2024-02-02 13:42:46,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170685256744183.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |