准备面试二
1、线程中的run和start的区别?
run()相当于线程的任务处理逻辑入口方法,它由Java虚拟机在运行相应线程时直接调用
start()的作用是启动相应的线程,该线程进入就绪状态,start()调用结束并不表示相应线程已经开始运行,这个线程可能稍后运行,也可能永远不运行。
2、可不可以不通过start()方法,直接调用run()方法呢?
可以,如果直接调用线程类的run()方法,它就会被当作一个普通的函数调用;
start()方法可以异步地调用run()方法,但是直接调用run()方法确实同步的,不能达到多线程的目的。
3、跨域的出现和解决
跨域是指a页面想获取b页面资源,如果a。b页面的协议,域名,端口不同或者是a页面是ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制跨域访问,也就是不允许跨域请求资源。
解决:Jsonp,把请求路径转成jsonp的格式,再进行请求
JSONP的实现:创建一个回调函数,然后在远程服务器上调用这个函数并且将JSON数据格式作为参数传递,完成回调,将JSON数据填充进回调函数。
SpringBoot跨域解决方案:在Controller上加@CrossOrigin(最好看下原理)
@CrossOrigin(origins = "*",maxAge = 3600)//origin="*"代表所有域名都可访问
//maxAge飞行前响应的缓存持续时间的最大年龄,简单来说就是Cookie的有效期 单位为秒
4、GC回收垃圾的时候System.gc()和finalize()的区别
收集并删除未引用的对象。可以通过"System.gc()"来触发垃圾回收,但并不保证会确实进行垃圾回收。
JVM的垃圾回收只收集那些由new关键字创建的对象,所以。如果不是用new创建的对象,你可以用finalize函数来执行处理。
5、Java创建对象的几种方式?
1.使用new关键字,比如:Student student = new Student();
2.使用Class类的newInstance方法,这个newInstance方法调用无参的构造器创建对象:Student stu = Student.class.newInstance();
3.使用Constructor类的newInstance方法,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数,事实上Class的newInstance方法内部调用Constructor的newInstance方法:Student stu = constructor.newInstance();
4、使用Clone的方法:要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法。如:Student stu2 = <Student>stu.clone();
6、MQ消息的丢失和中途宕机解决?
1.服务端丢失:把内存中的消息持久化,重启mq时进行从序列化文件中获取
2.客户端丢失:用户发出的消息还在缓存中,mq可以重新进行read
7、请求方式有几种?
1.GET:请求指定的页面信息,并返回实体主体
2.POST:请求服务器接受所指定的文档作为对所标识的URI的新的从属实体
2.HEAD:只请求页面的首部
3.DELETE:请求服务器删除指定的页面
4.COPY:请求服务器将指定的页面移至另一个网络地址
5.LINK:请求服务器建立连接关系
6.UNLLINK:断开连接关系
8、volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法
9、TCP的三次握手,在进行数据传输前,必须和对方建立可靠连接
1.客户端发送请求通知后台
2.后台回应客户端可以建立连接
3.客户端检查连接标志,正确则与服务器建立连接,后续开始传输数据
10、UDP用户协议数据,是一种无连接的传输层协议,无状态传输协议;优点是快,要求资源少,没有握手连接,但是不稳定,数据传递时容易丢包。
11、Redis底层协议是TCP
12、java如何实现秒杀商品
把商品数量放入到redis中,当某一个用户购买成功后,同步缓存,数量为0,别的用户就不能购买。
13、Redis缓存同步的方法
读取数据的时候。先从redis里面查,若没有,再去数据库查,同时写到redis里面,并且设置失效时间。
14、ajax传递对象,controller如何接收
使用@requestBody注解
通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上。
15、Java中的队列
队列是一种特殊的线性表,它只允许在表的前段(front)进行删除操作,只允许在表的后端(rear)进行插入操作。进行插入操作的端称未队尾,进行删除操作的端成为队头。对于一个队列来说,每个元素总是从队列的rear端进入队列,然后等待该元素之前的所有元素出队之后,当前元素才能出队,遵循先进先出(FIFO)的原则,如果队列中不包含任何元素,该队列被称为空队列。
Java提供了一个Queue接口,并为该接口提供了众多的实现类:ArrayBlockingQueue、LinkedBlockingQueue、ConcurrentLinkedQueue。
ArrayBlockingQueue、LinkedBlockingQueue和CurrentLinkedQueue,它们都是线程安全的队列。LinkedBlockingQueue吞吐量较高,但是性能低。