一、sleep和wait有什么区别
sleep通常用于暂停线程执行,wait通常用于线程间交互
二Java有多少种锁以及使用场景
1、公平锁:线程按照申请所得顺序来获取锁,然后有序执行
2、非公平锁:多个线程获取锁的顺序,不是先到先得的顺序,执行时无序的。
优点:非公平锁的性能高于公平锁
缺点:有可能造成线程饥饿(可能有线程很长一段时间获取不到锁)
Java中的非公平锁:sybchronized是非公平锁,ReentrantLock可以通过构造函数指定该锁是公平的,还是不公平的,默认不公平
3、读写锁:通过ReentrantReadWriteLOck类来实现
读锁:允许多个线程获取读锁,同时访问同一个资源
写锁:只允许一个线程获取写锁,不允许同时访问同一个资源
4、自旋锁:为了让线程等待,我们只需让线程执行一个自选,自旋次数默认10次
优点:避免了线程切换的开销。
缺点:挂起线程和恢复线程的操作需要转入内核态中完成,并发压力比较大
5、可重入锁:任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞。java中的可重入锁用ReentrantLock,synchronized修饰的方法和代码段
问:可重入锁如果加了两个,只释放了一把会出现什么问题
答:程序卡死,第二把锁没有解锁,线程不能出来
问:如果只加了一把锁,释放两次会出现什么问题
答:会报错,java.lang.llegalMonitorStateExcption
5000字 | 24张图带你彻底理解Java中的21种锁 (qq.com)
三、volatile关键字的作用及使用场景
1、保持可见性:该关键字确保对一个变量的更新对其他线程马上可见。
当一个变量被声明为volatile时,线程再写入变量是不会把值缓存在寄存器或者其他地方,而是会把值刷新回主内存
当其他线程读取该共享变量时,会从主内存重新获取最新值,而不是使用当前线程的工作内存中的值
2、避免了指令重排
volatile实现禁止了指令重排优化,避免多线程环境下程序出现乱序执行的情况
volatile实现禁止指令重排优化底层原理:(理解的不透彻)
通过内存屏障来实现,
阻止屏障两次的指令重排序
强制把写缓存区/高速缓存中的脏数据等写回主内存,或者让缓存相应的数据失效
3、不保证原子性
4、volatile的使用场景(单例模式)
如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的,同时还会禁止指令重排序
四、理解CAS 和 CAS的ABA问题
CAS可以保证变量操作的原子性
并发量不是很高的情况下,使用CAS要比锁机制更高
在线程对共享资源占用时间较短的情况下,使用CAS效率会更高
ABA问题
CAS在操作的时候会检查变量的值是否被更改过,如果没有则更新值,但是带来一个问题,最开始的值是A,接着变成B,最后又变成了A。经过检查这个值确实没有修改过,因为最后的值还是A,但是实际上这个值确实已经被修改过了。为了解决这个问题,在每次进行操作的时候加上一个版本号,每次操作的就是两个值,一个版本号和某个值,A——>B——>A问题就变成了1A——>2B——>3A。在jdk中提供了AtomicStampedReference类解决ABA问题,用Pair这个内部类实现,包含两个属性,分别代表版本号和引用,在compareAndSet中先对当前引用进行检查,再对版本号标志进行检查,只有全部相等才更新值。
CAS确定修改的值就是预期修改的值(在拿到这个值和修改过程中没有改操作),才去修改,加上版本号机制,版本号相同则更改,不同则有人操作过,则不更改
五、线程池
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方法这样的处理方式写的同时更加明确线程池的运行规则,规避资源耗尽的风险
1、线程池的三大方法
单一线程(只能有一个线程在执行)
固定线程(设置最大可执行的线程数)
伸缩线程(可多可少,自行设置)
2、线程池有几个参数以及作用
corePoolSize(核心线程数)
maxmumPoolSize(最大核心线程数):一般设置为电脑的最大核数
keepAiveTime(空闲线程存活时间)
unit(过期时间单位)
workQueue(工作队列)
threadFactory(线程工厂)
handler(拒绝策略)
3、线程池的四种拒绝策略
AbortPolicy(中止策略)线程池会抛出异常并中止执行此任务
CallerRunPolicy:把任务交给添加此任务的main线程去执行
DiscardPolicy:忽略此任务,忽略最新的一个任务
DiscardOldestpolicy:忽略最早的任务,最先加入队列的任务
六、sybchronized和ReetranLock的区别
七、AQS的实现原理和场景分析
八、关于死锁
九、Atomic原子类
十、ThreadLocal是什么,ThreadLocal内存泄露问题
十一、IO密集型和CPU密集型的区别