zl程序教程

您现在的位置是:首页 >  其他

当前栏目

学习笔记20230318

2023-04-18 16:50:01 时间

目录

一、创建线程有哪几种方式

二、为什么不建议Executors来创建线程池

三、线程池有哪几种状态,分别来表示什么

四、Sychronized和ReenTrantLock有什么区别

五、ThreadLocal 有哪些应用场景

六、ReenTrantLock 公平锁和非公平锁,底层是如何实现的

七、Synchronized 锁的升级是怎样的;

八、Tomcat中为什么要有自定义加载器

九、面向对象

十、JDK、JRE、JVM区别和联系

总结



一、创建线程有哪几种方式

extends Thread;

implement Runable;

implement Callable; FutureTask()->new Thead(); task.get()

Executors;

都是基于Runable;

二、为什么不建议Executors来创建线程池

使用无界阻塞队列,可能会导致OOM;

三、线程池有哪几种状态,分别来表示什么

Running:可运行状态,正常运行任务,接受新任务;

Shutdown:停止接收任务,将队列 中的任务执行完;

Stop: shutdownnow,中断正在运行的任务,不会将队列中的任务执行完;

Tidying: 线程池都tidying  ,terminated();

terminated:

四、Sychronized和ReenTrantLock有什么区别

1、java关键字,jdk的类;

2、jvm 层面,api;

3、自动释放锁,手动释放锁;

4、非公平锁,非公平和公平锁;

5、锁升级,锁不升级;

五、ThreadLocal 有哪些应用场景

1、传递变量保证线程安全;

2、数据库连接;

3、注意:Thread下都有ThreadLocalMap,是ThreadLocal 内部类,Key值是弱引用,在多线程下Entry 可能会造成内存泄漏,手动释放remove;

六、ReenTrantLock 公平锁和非公平锁,底层是如何实现的

公平锁和非公平锁:加锁是否需要先排队(AQS队列);

                               唤醒是没有区别的;

七、Synchronized 锁的升级是怎样的;

偏向锁:对象头有一个线程ID,可重入;

轻量级锁:有另外 一个线程来竞争,通过自旋方式,不阻塞线程;

重量级锁:自旋次数过多,升级重量级锁,会阻塞线程;

自旋:一直判断锁的状态;

八、Tomcat中为什么要有自定义加载器

1、方法区通过类的唯一标识,可以使用类加载器去做区别;

2、热加载的机制;

九、面向对象

面向过程:打开洗衣机 -> 放衣服 -> 放洗衣粉-> 清洗 -> 烘干;

面向对象:区别成对象:人和洗衣机;

优点:易复用,扩展,维护;

十、JDK、JRE、JVM区别和联系

JDK: 开发工具;相比jre jconsole ,javac ;

JRE: 运行环境;只需要运行的情况,只需要安装 jre;

JVM:  机器能识别的语言,Window,Linux  不同的JVM , 一处编译到处运行;


总结