四种线程池拒绝策略
(1)AbortPolicy
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
这是线程池默认的拒绝策略,在任务不能再提交的时候,抛出异常,及时反馈程序运行状态。如果是比较关键的业务,推荐使用此拒绝策略,这样子在系统不能承载更大的并发量的时候,能够及时的通过异常发现。
(2)DiscardPolicy
ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。
使用此策略,可能会使我们无法发现系统的异常状态。建议是一些无关紧要的业务采用此策略。
(3)DiscardOldestPolicy
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
(4)CallerRunsPolicy
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务,此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。
AOP术语
1. 连接点(Joinpoint)
连接点描述的是程序执行的某个特定位置。如一个类的初始化前、初始化后,或者类的某个方法调用前、调用后、方法抛出异常后等等。一个类或一段程序代码拥有一些具有边界性质的特定点,这些特定点就称为连接点。连接点用来定义在目标程序的哪里通过AOP加入新的逻辑。
2. 切入点(Pointcut)
切入点是一个连接点的过滤条件,AOP 通过切入点定位到特定的连接点。。类比:连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一对一的关系,一个切点匹配多个连接点。
3. 通知(Advice)
切面在某个具体的连接点采取的行为或行动,称为通知。切面的核心逻辑代码都写在通知中,有人也称之为增强或者横切关注点。通知是切面功能的具体实现,通常是业务代码以外的需求,如日志、验证等,这些被模块化的特殊对象。
4. 通知器(Advisor)
通知器由一个切入点(pointcut)和一个通知(Advice)组成。
垃圾收集器
新生代收集器:Serial、ParNew、Parallel Scavenge;
老年代收集器:Serial Old、CMS、Parallel Old;
通用收集器: G1;
常用组合:Serial+Serial Old, Parallel Scavenge+Parallel Old,ParNew+CMS,G1(不需要组合其他收集器)。
Java程序初始化的遵循的三个原则
以下三个原则优先级依次递减:
1、静态对象(变量 )优先于非静态对象初始化,其中,静态对象(变量)只初始化一次,而非静态对象可以初始化多次。
2、父类优先于子类进行初始化
3、按照成员变量定义顺序进行初始化
具体顺序:
1.父类静态变量
2.父类静态代码块
3.子类静态变量
4.子类静态代码块
5.父类非静态变量
6.父类非静态代码块
7.父类构造方法
8.子类非静态变量
9.子类非静态代码块
10.子类构造方法
分布式锁的实现方式
目前分布式锁的实现方案主要包括三种:
-
基于数据库(唯一索引)
-
基于缓存(Redis,memcached,tair)
-
基于Zookeeper
磁盘调度算法
1、先来先服务
磁盘调度的最简单形式当然是先来先服务(FCFS)算法。虽然这种算法比较公平,但是它通常并不提供最快的服务。
2.最短寻道时间优先(SSTF)
在移动磁头到别处以便处理其他请求之前,处理靠近当前磁头位置的所有请求可能较为合理。这个假设是最短寻道时间优先(SSTF)算法的基础。
SSTF 算法选择处理距离当前磁头位置的最短寻道时间的请求。换句话说,SSTF 选择最接近磁头位置的待处理请求。
3.电梯算法(scan)
对于扫描算法,磁臂从磁盘的一端开始,向另一端移动;在移过每个柱面时,处理请求。当到达磁盘的另一端时,磁头移动方向反转,并继续处理。磁头连续来回扫描磁盘。SCAN 算法有时称为电梯算法,因为磁头的行为就像大楼里面的电梯,先处理所有向上的请求,然后再处理相反方向的请求。
shell脚本中
shell脚本中,需求如下:如果 ls /tmp 执行成功输出True,否则输出Fail,下列哪项正确
-
ls /tmp; [[ $# -eq 0 ]] && echo True || echo Fail
-
ls /tmp; [[ $* -eq 0 ]] && echo True || echo Fail
-
ls /tmp; [[ $0 -eq 0 ]] && echo True || echo Fail
-
ls /tmp; [[ $? -eq 0 ]] && echo True || echo Fail
解释:
-
ls /tmp
: 执行ls命令来检查/tmp目录是否存在 -
$?
: 是上一个命令的返回值。如果ls命令执行成功,则返回值为0;否则返回值为非零值。 -
[[ $? -eq 0 ]]
: 如果上一个命令的返回值为0,即ls命令执行成功,则条件成立。 -
&&
: 是逻辑与操作符。如果前一个命令成功执行,则执行后一个命令。 -
echo True
: 如果ls命令执行成功,则输出True。 -
||
: 是逻辑或操作符。如果前一个命令执行失败,则执行后一个命令。 -
echo Fail
: 如果ls命令执行失败,则输出Fail。
选项 A 中的$#表示命令行参数个数,而不是上一条命令执行结果的状态码。
选项 B 中的$*表示所有命令行参数的字符串,而不是上一条命令执行结果的状态码。
选项 C 中的$0表示脚本名字,而不是上一条命令执行结果的状态码。
选项 D 中的$?表示上一条命令执行的状态码,如果状态码为 0,表示命令执行成功,否则表示执行失败。因此这个选项是正确的。
linux指令
linux命令中cat、more、less、tail、head均可用来查看文件内容,主要区别有:
cat是一次性显示整个文件的内容,适用于文件内容少的情况;
more和less一般用于显示文件内容超过一屏的内容,并且提供翻页的功能。
tail 和 head分别显示文件的后几行和前几行内容。常用于大文件的截取。
网络安全
由于前端直接可被用户访问,攻击者可以轻易得到页面和通讯过程中的相关信息,进而进行恶意的攻击,关于其攻击的方式描述正确的有哪些?
A
假定站点 foo.com 的服务器架设在公司内网,提供了任意站点截图服务 foo.com/screenshot?url=xxx,恶意修改 url 中的值为内网地址,构成 SSRF 攻击,进而造成数据泄露的风险
B
网站 foo.com 提供 POST 方法的 /tansfer/to/xxx 的转账服务,由于未做 CSRF 的防范,被攻击者重复伪造该请求,形成重放攻击,造成经济损失
C
网站 foo.com 使用了非安全的 HTTP 协议,其中转账服务 POST /transfer/to/xxx,转账金额 money 在 payload 上,假定接口层面采用了随机 token 来防范 csrf 攻击,接口参数未做签名校验,此时攻击者通过篡改 money 的数值,构成中间人攻击
D
借助社会工程学的理论基础,基于用户的贪婪等心理,制作一个 qq.com 的”冒牌”中奖页面,诱导用户输入账号密码进行登录,造成隐私的泄露,属于”钓鱼”的网络欺诈行为
正确答案:ABCD
tcp粘包
tcp发送报文数据时,可能将多个数据包合并成一个大的数据包发送,就有可能发生粘包问题。如何解决?
答:
出现粘包,主要是tcp为了提高效率,每次都要等足够长的数据才进行发送,接收方要等到足够长的数据才从缓冲区提取。解决的办法就是只要能把包分开就不影响传输。
A:固定长度,肯定可以;
B:分隔符
D:添加长度信息。