2021-01-07

一、synchronized与锁
在不考虑底层的锁的实现,那么JAVA多线程的锁都是基于对象的,JAVA中的每一个对象都可以作为一个锁;JAVA类只有一个Class对象(可以有多个实例对象,多个实例共享这个Class对象);
1、Synchronized关键字
synchronized通常有以下三种形式:
在这里插入图片描述

临界区:指的是某一块代码区域,它同一时刻只能由一个线程执行;
2、几种锁(在 java SE1.6中为了减少获取锁和释放锁带来的性能消耗)
Java对象头
每个JAVA对象都有对象头,非数组类型用两个字宽来存储,若是数组,则会用3个字宽来存
储;
在这里插入图片描述
在这里插入图片描述

不同类型的锁在Mark Word中存储不同的东西;
无锁状态
无锁就是没有对资源进行锁定,任何线程都可以尝试去修改它;
偏向锁状态
锁不仅不存在多线程竞争,而且总是由统一线程多次获得;偏向锁在资源无竞争情况下消除
了同步语句,CAS操作(加锁/解锁)不进行,提高了程序的运行性能;
当线程第一次进入同步块时,会在对象头的锁记录里面存储锁定锁的偏向线程ID。再次进入
同步块时,判断Mark Word里面是不是自己的线程ID。若是,则不用CAS操作;若不是,则代表
有另一个线程来竞争这个偏向锁。
若竞争成功,则表示之前线程不存在了,修改线程ID,锁依然是偏向锁;若失败,表示之前
的线程依然存在,暂停之前线程,升级锁为轻量级锁,按照轻量级锁的方式进行竞争;
在这里插入图片描述
在这里插入图片描述

偏向锁升级为轻量级锁会暂停拥有偏向锁的线程,重置偏向锁标识,实际开销很大。因此,
对于锁通常处于竞争状态,那么偏向锁就是一种累赘;
轻量级锁状态
多个线程在不同时段获取同一把锁,即不存在锁竞争的情况。此时,JVM采用轻量级锁来避
免线程的阻塞与唤醒;
JVM会为每个线程在当前线程的栈帧中创建用于存储锁记录的空间Displaced Mark Word。
如果一个线程获得锁的时候发现是轻量级锁,会把锁的Mark Word复制到自己的Displaced Mark
word里面。然后线程通过CAS将锁的Mark Word替换为指向锁记录的指针。若成功,则当前线程
获得锁;如果失败,表示Mark Word已经被替换为其他线程的锁记录,说明与其他线程竞争锁,
当前线程通过自旋(循环不断尝试获取锁,可以设置循环的次数)来获取锁。
JDK采用自适自旋,自旋成功,下次次数更多;自旋失败,下次次数更少;
自旋失败,则阻塞当前线程,同时将锁升级为重量级锁;
在这里插入图片描述

释放锁时,当前线程使用CAS操作将Displaced Mark Word的内容复制回锁的Mark Word里
面。如果没有竞争,这个操作成功;若其他线程因为自旋失败导致锁升级为重量级锁,那么操作
失败,当前线程释放锁并唤醒阻塞的线程;
重量级锁状态
重量级锁依赖操作系统的互斥量实现,操作系统中线程间状态转换需要相对比较长的时间,
重量级锁的效率很低,但被阻塞的线程不会消耗CPU;
多个线程同时请求某个对象锁时,对象锁会设置几种状态来区分请求的线程:
在这里插入图片描述

各种锁的优缺点:
| 在这里插入图片描述
二、浏览器键入网址后发生的事情(二)
5、远程定位——IP
TCP模块在执行连接、收发、断开等各阶段操作时,都需要委托IP模块将数据封装为网络包发送给通信对象;
IP报文
在这里插入图片描述

6、两点传输——MAC
在生成IP头部之后,网络包还需要在IP头部的前面加上MAC头部;
MAC头部是以太网使用的头部,包含接收方和发送方的MAc地址等信息;
ARP协议通过广播的形式获取IP地址对应的网卡MAC地址,并且操作系统会把查询结果方法ARP缓存中;
7、出口——网卡
IP生成的网络包只是内存中的一串二进制数字信息,没有办法直接发送。我们需要将数字信息转换为电信号,才能在网线上传输。、
负责这一操作的是网卡,控制网卡需要网卡驱动程序。网卡驱动程序获取网络包后,将其复制到网卡内的缓存区中,接着在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列
在这里插入图片描述

8、送别者——交换机(仅仅负责转发)
交换机的包接收操作
电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数
字信号,然后通过FCS校验错误,没问题放到缓冲区;
交换机的端口不具有MAC地址;
交换机根据MAC地址表查找MAC地址,然后将信号发送到相应的端口;
MAC地址表找不到指定的MAC地址
该设备没有向交换机发送过包,或者这个设备一段时间没有工作导致地址从地址表中删除了
;这种情况下,交换机就会将包转发到除了源端口之外的所有端口;
MAC地址中的FF:FF:FF:FF:FF:FF属于广播地址;
9、出境大门——路由器
路由器的每个端口都具有MAC地址和IP地址;
路由器原理
路由器的端口具有MAC地址和IP地址,它可以作为以太网的发送和接收方,某种意义上,它
和计算机的网卡是一样的;
转发包时,路由器的端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应
的端口作为发送方将以太网包发送出去;
路由器的包接收操作
电信号到达网线接口部分后转换为数字信号,并且通过FCS进行错误校验;
没有问题则检查MAC报文中的接收方MAC地址,如果是自己的则接收,不是自己的则丢弃;
查询路由表确定输出端口
完成包接收操作后,路由器就会去掉包开头的MAC头部;
MAC头部的作用就是将包送达路由器,其中接收方的MAC地址就是路由器端口的MAC地址
。当包到达路由器之后,MAC头部就会被丢弃,并且根据IP头部的内容进行包的转发;通过子网
掩码获取转发的网段后,根据路由表进行对应端口的转发;
路由器的发送操作
根据路由表的网关列判断对方地址(是否到达对应的以太网内,是否需要路由器继续转发):
网关是一个IP地址,则这个IP地址就是我们要转发到的目标地址,还没到达终点,需要路由
器继续转发;
如果网关为空,则IP头部中的接受方IP地址就是要转发到的目标地址,说明已经抵达终点;
在网络包传输的过程中,源IP和目标IP始终是不会变的,一直变化的是MAC地址,因为需要
MAC地址在以太网内进行两个设备间的包传输;
IP包在发送出去之前,需要重新把MAC头加至IP包上。其中发送者MAC地址写上路由器自己
的MAC地址,接收者MAC地址通过ARP获取;
10、互相扒皮——服务器与客户端
数据包在服务端和客户端之间相互扒皮。
三、Java Web中servlet杂项知识
1、解决一个servlet中有多个请求处理方法
在发送请求的时候多给出一个参数指定调用的方法;
请求处理方法的签名与service相同;
2、转发与重定向
重定向:response.sendRedirect(string path)
浏览器提交两次请求,服务器发送两次响应,多用于表单或更换页面;
转发:request.getRequestDispatcher(servlet名).forword(request,response)
只发送一次请求与响应,地址栏不会发生变化;
重定向可以跨服务器访问,转发只能在同一Web应用当中;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值