介绍一下线程池的种类
线程池是一种多线程处理方法,帮我们管理线程。使用线程池的好处是减少在创建和销毁线程上所花费的时间以及系统资源的开销,解决资源不足的问题。
线程池的种类:
-
newCachedThreadPool:只有非核心线程,最大线程数非常大,所有线程都活动时会为新任务创建新线程,否则会利用空闲线程来处理任务。
优点:任何任务都会被立即执行,比较适合执行大量的耗时较少的任务。
-
newFixedThreadPool:只有核心线程,并且数量固定的。线程池空闲时不会释放工作线程,还会占用一定的系统资源。
优点:更快的响应外界请求。
-
newScheduledThreadPool:核心线程数固定,非核心线程没有限制。
优点:执行定时任务以及有固定周期的重复任务
-
newSingleThreadExecutor:只有一个核心线程,确保所有的任务都在同一线程中按序完成
优点:不需要处理线程同步的问题
内存泄漏与内存溢出
-
内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,多次的内存泄漏最终会导致内存溢出。
-
内存溢出是指程序在申请内存时,没有足够的内存空间供其使用。
强软弱虚引用
-
强引用是GC不会取回收的对象;
-
弱引用是GC在执行会去回收的对象;
-
软引用是在内存不足时,GC采取回收的对象;
-
虚引用是在任何时候被垃圾回收器回收。
synchronized锁的实现原理
synchronized是JVM实现的一种互斥同步访问方式,底层是基于每个对象的监视器(monitor)来实现的。被synchronized修饰的代码,在被编译器编译后在被修饰的代码前后加上了一组字节指令。在代码开始加入了monitorenter,在代码后面加入了monitorexit。在虚拟机执行到monitorenter指令的时候,会请求获取对象的monitor锁,基于monitor锁又衍生出一个锁计数器的概念。当执行monitorenter时,若对象未被锁定时,或者当前线程已经拥有了此对象的monitor锁,则锁计数器+1,该线程获取该对象锁。当执行monitorexit时,锁计数器-1,当计数器为0时,此对象锁就被释放了。那么其他阻塞的线程则可以请求获取该monitor锁。
Get和Post的区别
- get是从服务器上获取数据,post是向服务器传送数据。
- get会将参数数据拼接到URL上,可以在URL中看到参数值,安全性较低,post将参数数据放在请求体中,用户无法直接看到参数值,安全性较高。
- get传输的数据量较小,不能大于2kb。post传输的数据量较大,默认不受限制。
想要不曾有的美丽,就要坚持不懈的努力。