- 讲讲进程和线程的区别
- 进程作为资源分配的基本单位,线程作为资源调度的基本单位
- 为什么要用多线程呢?平时工作中用得多吗
- 使用多线程最主要的原因是提高系统的资源利用率,CPU都是多核的,如果只用单线程,那就是只用到了一个核心,其他的核心就相当于空闲在那里了
- Web服务器用的是 Tomcat,Tomcat 处理每一个请求都会从线程连接池里边用一个线程去处理
- 连接数据库会用对应的连接池 Druid/C3P0/DBCP
- 讲讲什么是线程安全
- 线程安全就是多个线程去执行某类,这个类始终能表现出正确的行为,那么这个类就是线程安全的
- 平时是怎么解决,或者怎么思考线程安全问题的
- 判断是否要处理线程安全问题,就看有没有多个线程同时访问一个共享变量
- 先判断有没有线程安全问题,如果存在则根据具体的情况去判断使用什么方式去处理线程安全的问题
- 能不能保证操作的原子性,考虑
**atomic**
包下的类够不够我们使用。 - 能不能保证操作的可见性,考虑
**volatile**
关键字够不够我们使用 - 如果涉及到对线程的控制(比如一次能使用多少个线程,当前线程触发的条件是否依赖其他线程的结果),考虑
CountDownLatch
/ Semaphore 等等。 - 如果是集合,考虑
java.util.concurrent
包下的集合类。 - 如果 synchronized 无法满足,考虑 lock 包下的类
- ….
- 能不能保证操作的原子性,考虑
- 了解死锁吗?什么情况会造成死锁
- 造成死锁的原因可以简单概括为:当前线程拥有其他线程需要的资源,当前线程等待其他线程已拥有的资源,都不放弃自己拥有的资源
- 避免死锁的方式一般有以下方案
- 固定加锁的顺序,比如我们可以使用Hash值的大小来确定加锁的先后
- 尽可能缩减加锁的范围,等到操作共享变量的时候才加锁。
- 使用可释放的定时锁(一段时间申请不到锁的权限了,直接释放掉)