1.Java创建线程之后,直接调用start()方法和run()的区别
1 | start()用来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。 |
2.常用的线程池模式以及不同线程池的使用场景
1 | CachedThreadPool |
3.newFixedThreadPool此种线程池如果线程数达到最大值后会怎么办,底层原理
1 | 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。 |
4.多线程之间通信的同步问题,synchronized锁的是对象,衍伸出和synchronized相关很多的具体问题,例如同一个类不同方法都有synchronized锁,一个对象是否可以同时访问。或者一个类的static构造方法加上synchronized之后的锁的影响。
1 |
5.了解可重入锁的含义,以及ReentrantLock 和synchronized的区别
1 | 同一个线程再次进入同步代码的时候.可以使用自己已经获取到的锁,这就是可重入锁java里面内置锁(synchronize)和Lock(ReentrantLock)都是可重入的。 |
6.同步的数据结构,例如concurrentHashMap的源码理解以及内部实现原理,为什么他是同步的且效率高
1 | ConcurrentHashMap采用了非常精妙的"分段锁"策略,ConcurrentHashMap的主干是个Segment数组。 |
7.atomicinteger和volatile等线程安全操作的关键字的理解和使用
1 | volatile关键字 |
8.线程间通信,wait和notify
1 | 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程之间的通信就成为整体的必用方式之一。当线程存在通信指挥,系统间的交互性会更强大,在提高CPU利用率的同时还会对线程任务在处理过程中进行有效的把控与监督。 |
9.定时线程的使用
1 | 实现定时任务线程有如下三种方式: |
10.场景:在一个主线程中,要求有大量(很多很多)子线程执行完之后,主线程才执行完成。多种方式,考虑效率。
1 | join() |
11.进程和线程的区别
1 | 线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别: |
12.什么叫线程安全?举例说明
1 | 如果你的代码所在的进程中有多个线程同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他变量的值也和预期一样,我们就说是线程安全。线程安全问题都是由全局变量和静态变量引起的。 |
13.线程的几种状态
1 | 新建,就绪,运行,阻塞,死亡; |
14.并发、同步的接口或方法
1 | 1:线程池 |
15.HashMap 是否线程安全,为何不安全。 ConcurrentHashMap,线程安全,为何安全。底层实现是怎么样的。
1 | 不是线程安全地。当多个线程同时操作同一个数组位置的时候,也都会先取得现在状态下该位置存储的头结点,然后各自去进行计算操作,之后再把结果写会到该数组位置去,其实写回的时候可能其他的线程已经就把这个位置给修改过了,就会覆盖其他线程的修改。 |
16.J.U.C下的常见类的使用。 ThreadPool的深入考察; BlockingQueue的使用。(take,poll的区别,put,offer的区别);原子类的实现。
1 |
17.简单介绍下多线程的情况,从建立一个线程开始。然后怎么控制同步过程,多线程常用的方法和结构
18.volatile的理解
1 | volatile关键字为域变量的访问提供了一种免锁机制 |
19.实现多线程有几种方式,多线程同步怎么做,说说几个线程里常用的方法
1 | 常用的有两种方式:实现Runnable接口和继承Thread类。 |