HTTPS请求过程
浏览器向服务器发起请求,请求携带了浏览器支持的加密算法和哈希算法
服务器收到请求,选择浏览器支持的加密算法和哈希算法
服务器将数字证书返回给浏览器
浏览器进入数字证书的认证环节
浏览器生成一个随机数R,并使用网站公钥对R进行加密,浏览器将加密后的R传送给服务器
服务器通过自己的私钥解密得到R
服务器以R为密钥将使用了对称加密算法的加密网页内容传输给浏览器
浏览器以R为密钥使用之前约定好的解密算法获取网页内容
如果线上某台虚机CPU Load过高,该如何快速排查原因?只介绍思路和涉及的Linux命令即可
使用top命令可以查看哪个进程cup加载过高
- jps -v:查看java进程号
- top -Hp [java进程号]:查看当前进程下最耗费CPU的线程
- printf “%x\n” [步骤2中的线程号]:得到线程的16进制表示
- jstack [java进程号] | grep -A100 [步骤3的结果]:查看线程堆栈,定位代码行。参考:如何使用JStack分析线程状态
什么是分布式事务,分布式事务产生的原因是什么?分布式事务的解决方案有哪些?分别有哪些优缺点?
分布式事物:将一次大的操作分为很多小的操作,这些小的操作位于各自的服务器上,分布式事物需要保证这些小的操作要么全部成功,要么全部失败
队列
- 阻塞队列 (比如LinkedBlockingQueue、ArrayBlockingQueue)
- 非阻塞队列 (ConcurrentLinkedQueue)
阻塞和非阻塞区别
- 阻塞:试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来
- 非阻塞:和阻塞相反
基本方法
offer():往队列添加元素。如果队列已满直接返回false,队列未满则直接插入并返回true;
add():对offer()方法的简单封装。如果队列已满,抛出异常new IllegalStateException(“Queue full”);
put():往队列里插入元素,如果队列已经满,则会一直等待直到队列为空插入新元素,或者线程被中断抛出异常.
remove():直接删除队头的元素;
peek():直接取出队头的元素,并不删除。
element():对peek方法进行简单封装,如果队头元素存在则取出并不删除,如果不存在抛出异常NoSuchElementException();
pool():取出并删除队头的元素,当队列为空,返回null;
take():取出并删除队头的元素,当队列为空,则会一直等待直到队列有新元素可以取出,或者线程被中断抛出异常