1 常用的线程池有哪些
newFixedThreadPool | 创建固定大小的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大 小; |
newCachedThreadPool | 创建一个可缓存的线程池,此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小; |
newScheduledThreadPool | 创建一个大小无限的线程池,此线程池支持定时以及周期性执行任务的需求; |
newSingleThreadExecutor | 创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。 |
线程池能够带来三个好处
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控
2 JAVA 接口与抽象类(interface与abstract)的区别
相同点
(1)都不能被实例化
(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化
不同点
(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承
(3)接口强调特定功能的实现,而抽象类强调所属关系
(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public abstract的。
抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号
3 equal 和hashcode
(1)如果两个对象相同(equals方法返回true), 那么它们的hashCode值一定要相同;
(2)如果两个对象的hashCode相同,它们并不一定相同
4 为什么要使用连接池?
传统的数据库连接方式
一个连接对象对应一个物理连接,每次操作都打开一个物理连接,使用完都关闭连接,造成系统性能低下。
连接池技术
客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的close()方法,物理连接并没有关闭,数据源的实现只是删除了客户程序中的连接对象和池中的连接对象之间的联系.
数据库连接的建立及关闭是耗费系统资源的操作,在大型应用中对系统的性能影响尤为明显。为了能重复利用数据库连接对象,缩短请求的响应时间和提高服务器的性能,支持更多的客户,应采用连接池技术.
5 TCP/UDP区别
1.TCP/UDP区别,TCP三次握手,SYN攻击
TCP是面向连接的可靠传输,需要三次握手,保证可靠通信;有重传机制;
UDP是无连接的不可靠传输,但是速度快,适用于视频和电话会议等实时应用场景;
TCP三次握手是:SYN=x(SYN_SEND)、ACK=x+1,SYN=y(SYN_RECV)、ACK=y+1(ESTABLISHED);
SYN攻击是:SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。
检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。
一类是通过防火墙、路由器等过滤网关防护,另一类是通过加固TCP/IP协议栈防范。过滤网关防护主要包括超时设置,SYN网关和SYN代理三种。调整tcp/ip协议栈,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等。
但一般服务器所能承受的连接数量比半连接数量大得多
6 SessionFactory是线程安全的吗?Session是线程安全的吗?两个线程能共享一个Session吗?
1)SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。对于应用程序,最好将SessionFactory通过单例的模式进行封装以便于访问。
(2)Session是一个轻量级非线程安全的对象(线程间不能共享Session),它表示与数据库进行交互的一个工作单元。Session是由SessionFactory创建的,在任务完成之后会被关闭。Session是持久层服务对外提供的主要接口。Session会延迟获取数据库连接(也就是在需要的时候才会获取)。为了避免创建太多的session,可以使用TreadLocal来获取当前的session,无论你调用多少次getCurrentSession()方法,返回的都是同一个session
7 Spring Bean 的生命周期,如何被管理的
-
实例化一个Bean,也就是我们通常说的new
-
按照Spring上下文对实例化的Bean进行配置,也就是IOC注入
-
如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID
-
如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)
-
如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法
-
如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术
-
如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法
-
如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法
注意:以上工作完成以后就可以用这个Bean了,那这个Bean是一个single的,所以一般情况下我们调用同一个ID的Bean会是在内容地址相同的实例
-
当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法
-
最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法
8 jdk1.8的新特性
- 速度更快 – 红黑树
HashMap中的红黑树
HashMap中链长度大于8时采取红黑树的结构存储。
红黑树,除了添加,效率高于链表结构。
- 代码更少 – Lambda
Lambda表达式的基础语法:Java8引入了一个新的操作符“->”,该操作符成为箭头操作符或者Lambda操作符,箭头操作符将Lambda表达式拆分成两部分
左侧:Lambda表达式的参数列表
右侧:Lambda表达式中所需执行的功能,即Lambda体。
- 强大的Stream API – Stream
一系列流水线式的中间操作。
流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
注意:
①Stream自己不会存储元素。
②Stream不会改变源对象。相反,会返回持有新结果的新Stream。
③Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
- 便于并行 – Parallel
在必要的情况下,将一个大任务进行必要的拆分Fork成若干个小任务,再将小任务的运算结果进行Join汇总。
- 最大化减少空指针异常 – Optional
是一个容器类,代表一个值存在或不存在,原来用null 表示一个值不存在,现在Optional 可以更好的表达这个概念。并且可以避免空指针异常。
6、ConcurrentHashMap
Jdk1.7时隔壁级别CocnurrentLevel(锁分段机制)默认为16。
JDK1.8采取了CAS算法
Jdk1.8没有永久区,取而代之的是MetaSpace元空间,用的是物理内存。