目录
46.线程池中 submit()和 execute()方法有什么区别?
53.synchronized 和 volatile 的区别是什么?
55.synchronized 和 ReentrantLock 区别是什么?
46.线程池中 submit()和 execute()方法有什么区别?
(1)接收的参数不一样。exucute只能执行实现Runnable接口的线程,submit可以执行实现Runnable接口或Callable接口的线程
(2)submit有返回值,而execute没有
53.synchronized 和 volatile 的区别是什么?
(1)volatile只保证可见性,不保证原子性。
(2)synchronization既保证原子性有保证可见性。
54.synchronized 和 Lock 有什么区别?
(1)Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问;
(2)Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。
55.synchronized 和 ReentrantLock 区别是什么?
(1)ReentrantLock可以尝试获取锁,可以实现公平锁,可以设置锁超时时间
(2)synchronization是java内置的关键字,是jvm级别的,会自动释放锁。ReentrantLock是类,是jdk级别的,需要显式的手动释放锁。
58.什么是 java 序列化?什么情况下需要序列化?
(1)序列化:将 Java 对象转换成字节流的过程。反序列化:将字节流转换成 Java 对象的过程。
(2)当 Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。序列化的实现:类实现 Serializable 接口,这个接口没有需要实现的方法。实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被序列化。
注意事项:
- 某个类可以被序列化,则其子类也可以被序列化
- 声明为 static 和 transient 的成员变量,不能被序列化。static 成员变量是描述类级别的属性,transient 表示临时数据
- 反序列化读取序列化对象的顺序要保持一致
59.动态代理是什么?有哪些应用?
(1)在运行阶段给定一个被代理类,可以调用并扩展被代理类的方法。应用场景有日志,Spring AOP。
(2)动态代理的实现方法有jdk动态代理和cglib动态代理。JDK的动态代理机制只能代理实现了接口的类。cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,覆盖其中方法并实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
72.什么是 XSS 攻击,如何避免?
(1)xss(Cross Site Scripting),即跨站脚本攻击,也就是代码注入攻击, 攻击者往 web 页面里插入恶意的 HTML 代码(Javascript、css、html 标签等),当用户浏览该页面时,嵌入其中的 HTML 代码会被执行,从而达到恶意攻击用户的目的
(2)不管是用户端从任何的输入到任何输出都进行过滤,转义,让攻击者的代码注入不能识别,就可以避免攻击了
73.什么是 CSRF 攻击,如何避免?
(1)跨站请求伪造(英语:Cross-site request forgery).。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
(2)添加校验token
74.throw 和 throws 的区别?
throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。
void doA(int a) throws IOException{
try{
......
}catch(Exception1 e){
throw e;
}catch(Exception2 e){
System.out.println("出错了!");
}
if(a!=b)
throw new Exception3("自定义异常");
}