目录:
- 1、post为什么会发送两次请求?
- 2、单核CPU支持多线程吗?
- 3、ConcurrentHashMap 如何保证线程的安全性?
1、post为什么会发送两次请求?
A:那是因为浏览器的安全策略(同源策略)决定的;会进行一次预请求,第二次才会真正发送post请求。
预检请求中包含了一些额外的头部信息,如 Origin 和 Access-Control-Request-Method 等,用于告知服务器实际请求的方法和来源。服务器收到预检请求后,可以根据这些头部信息,进行验证和授权判断。如果服务器认可该跨域请求,将返回一个包含 Access-Control-Allow-Origin 等头部信息的响应,浏览器才会继续发送实际的跨域请求。
使用预检请求机制可以有效地防范跨域请求带来的安全风险,保护用户数据和隐私。
2、单核CPU支持多线程吗?
A:支持。
多任务系统往往需要同时执行多道作业。作业数往往大于机器的CPU数,然而一颗CPU同时只能执行一项任务,如何让用户感觉这些任务正在同时进行呢?
操作系统的设计者
巧妙地利用了时间片轮转的方式时间片是CPU分配给各个任务(线程)的时间,因为时间片非常短,所以CPU通过不停地切换线程执行。
3、ConcurrentHashMap 如何保证线程的安全性?
A:ConcurrentHashMap 是 HashMap 的线程安全版本,其内部和 HashMap 一样,也是采用了数组 + 链表 + 红黑树的方式来实现。
在 JDK1.7 版本中,ConcurrentHashMap 由数组 + Segment + 分段锁实现,其内部分为一个个段(Segment)数组,Segment 通过继承 ReentrantLock 来进行加锁,通过每次锁住一个 segment 来降低锁的粒度而且保证了每个 segment 内的操作的线程安全性,从而实现全局线程安全。
在 ConcurrentHashMap 中,采用了大量的分而治之的思想来降低锁的粒度,提升并发性能。其源码中大量使用了 cas 操作来保证安全性,而不是和 HashTable 一样,不论什么方法,直接简单粗暴的使用 synchronized关键字来实现