简单说下http协议
http就是超文本传输协议,详细规定了浏览器和万维网服务之间互相通信的规则。使用的是可靠的数据传输协议,在传输过程中不会被损坏或产生混乱。可以从web服务器上将各种信息发送到web浏览器上面去。是一种无状态的协议,http请求只能由客户端发起,服务端不能主动向客服端发送数据
url是统一资源标识符 两种形式分别是url和urn
常见的http方法:get,put,post,delete,head。
四次挥手
第一次挥手:客户端发送一个fin到服务端来请求断开连接
第二次挥手:服务端收到客户端的fin后,发送ack给客户端,确认序号为收到序号+1,此时tcp处于半关闭状态
第三次挥手:服务端发送fin给客户端
第四次挥手:客户端收到服务端的fin后,发送ack给服务端,确认序号还是为受到序号+1,4次挥手完成,网络连接关闭
为什么不是三次挥手?
因为tcp的连接是全双工的,前三次挥手服务端只发送了ack,并没有发送fin,假如连接断开,这个时候只是客户端和服务端的连接断开了,服务端和客户端的连接并没有断
浏览器输入url后发生了什么?
1.浏览器通过dns向服务器请求域名
2.服务器将域名返回给浏览器,浏览器通过域名得到ip地址,然后开始三次握手
3.建立好tcp/ip连接后,发送http请求给服务器
4.服务器接收到请求后将视图返回给浏览器
5.浏览器解析并渲染整个视图
四种隔离级别
未提交读,提交读,可重复读,可串行化
未提交产生脏读,可重复读产生幻读
spring ioc的加载过程
获取资源,获取BeanFactory,根据新建的BeanDefinitionReader创建BeanFactory对象,装载资源
wait和sleep的区别
sleep方法属于Thead类,wait方法属于Object类,sleep方法会使程序暂停指定时间,让出cpu给其他线程,但是依然持有着锁,而调用wait方法线程会放弃锁,只有针对对象的notify方法后本线程才可以重新开始去竞争锁
synchronized的底层原理,是可重入锁吗?
synchronized是一个悲观锁,底层原理是虚拟机基于进入和退出monitor对象来实现方法同步和代码同步的。方法同步是隐式的,无需通过字节码指令来控制,代码块同步是利用的monitorenter和monitorexit。每次执行monitorenter指令就会对计数器加1,正式因为这个,所以synchronized是可重入锁,如果想要再次获得锁,只需要使计数器加1,每释放一次减1,当计数器为0时释放锁
CAS原理 java内存模型 CAS的问题 怎么解决该问题?
CAS即compare and swap,是一种有名的无锁算法,通过无锁的方式实现了多个线程间变量的同步,原理就是当你要更改一个值时首先要从内存出取得值A,然后有一个期待值B,要更新的目标值C,假如A和B相等才更新A的的值为C,否则会进入自旋等待。CAS的问题就是自旋和ABA问题,ABA问题就是你以为值没有变,其实已经改变了不过又变回来了,解决方法就是版本号或者时间戳,每次获取该值时会得到一个时间戳,然后当你更新时对比现在的时间戳与第一次是否相同,相同则可以更新。JAVA内存结构是分为方法区,堆,本地方法栈,虚拟机栈,程序计数器
HashMap为什么线程不安全?举个例子
hashMap有自动扩容机制,当容量超过负载因子时会进行自动扩容,也就是再哈希,而这个过程会计算所有元素的新的位置并把它们放入新的数组中,在多线程的环境下存在某一时刻其他元素也在进行put操作,这个时候假如是hashcode值相同,则会在同一个数组下形成闭环,当后面调用get操作时形成死循环
B树,B+数的数据结构和查询复杂度?
B树的数据结构就是可以拥有多于两个子节点的二叉查找树(2-3查找树的扩展)
B+树就是B树的一种变形树。
B+树的优点:查询的IO次数更少,查询都要到达子节点,所以更加稳定,叶子结点形成有序链表,便于范围查询
复杂度:logn
除了设置数据库隔离级别,还有什么方法可以解决不可重复读?
MVCC和锁
tcp和udp的区别,tcp为什么是面向连接的,用户态和内核态的区别?
tcp是面向连接的,更加可靠,而且是点对点,tcp拥有阻塞控制机制,面向字节流
udp无连接,不可靠,多种通信方式,面向报文
因为tcp要保证可靠,确保对方是否完整收到,所以是面向连接的,而udp发出后就不管了
用户态应用程序只能在用户态运行,操作系统在内核态运行