java面试2022-1-11
java多线程加锁的方式
-
使用java里的关键字synchronized给线程加锁
-
使用实现Lock这个的方法同步访问
两者的区别
synchronize修饰代码块时,当一个线程获得对应的锁并且执行这个代码块时,其他线程只能一直等待,等待获取锁的线程释放锁:
(1)获取锁的线程执行完该代码块,然后释放锁
(2)线程行为发生异常时,JVM会自动释放锁
synchronize缺点:可能会造成线程的阻塞当该线程需要等待IO时或者sleep()被阻塞,但又没有释放锁,其他线程都要等待,影响效率。
Lock是手动上锁,手动释放锁,而synchronize是自动释放,lock不是java内置的,是类。
synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁,在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择
HTTP请求报文头属性
- Accept:告诉服务器,客户端接收什么样类型的响应
- Cookie:客户端的cookie是通过该属性传给服务端的
- Referer:表示这个请求是从那个url来的
- Cache-control对缓存进行控制
跨域问题
- 同源策略:
如果是协议和端口造成的跨域问题“前台”是无能为力的
解决方法
1)CORS(跨域资源共享)(cross-origin resourse sharing)通过服务器的response响应头里参数标注:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials:true
2 )服务器代理 跨域是js的特性,服务端不受影响,所以可以用服务器来请求对应的数据,再返给前端。
然后就是前端来处理跨域问题
1)Ajax的jsonp 它利用的是html标签中src属性可以不受跨域影响的特性。
2)document.domain主要用于主域名相同的不同子域名之间的跨域
3)http-proxy-middleware 代理解决(项目使用vue-cli脚手架搭建)
补充:域名
顶级域名,我们知道域名由两个或两个以上的词构成,中间由点号分隔开,最右边的那个词就叫做顶级域名。我们接触的顶级域名又分为两类:一是国家和地区顶级域名。例如中国是cn,美国是us等;二是国际顶级域名,例如表示工商企业的.com,表示非盈利组织的.org,表示网络商的.net等。
一级域名又称顶级域名,即:
baidu.com
二级域名,即:
www.baidu.com
三级域名,即:
.().().baidu.com
总结
将前端和后端连接的逻辑搞清楚,也是面试的一大问题。