1.hash算法
散列,就是把任意长度值(key)通过散列算法变换成固定长度的key(地址)通过这个地址进行访问数据结构。用来加快查找的速度。
2、并发三大特性
原子性:是指在一个操作中cpu不可以在中途暂停然后再调度,即不被中断操作、要不全部执行完成,要不都不执行。
可见性:写入内存的变量,立即能被其他线程可见性。
有序性:虚拟机在进行代码编译时,对于那些改变顺序之后不会对最终结果造成影响的代码,虚拟机不一定按照我们的顺序来执行,有可能会重新排序。
3.形成的生命周期
1.新建状态(NEW):新建一个线程。
2.就绪状态(Runable):对象调用了start方法。该线程变得可运行池中,变得可运行,等待cpu的使用权。
3.运行状态(Running):获得cpu的使用权。
4.阻塞状态(Blocked):因为某种原因放弃cpu使用权,暂时停止运行。
5.死亡状态(Dead):线程执行完成了。
4.sleep()、wait()、join()、yield()的区别
1.池锁,所有需要竞争同步锁的,都会放到同步锁中。
2.等待锁,当我们调用wait方法的时候,线程会放到等待锁中,等待池的线程是不会去竞争同步锁的。
主要区别:sleep方法不会释放锁,但是wait会释放锁。
5、Treadlocal内存泄漏原因
不再使用的对象,不能释放,就是内存泄露。
强引用
1.新建对象通过new创建的。当对象为空的时候,开始释放垃圾。
软引用
当内存不够用的时候,会释放软引用的内存空间。
弱引用
发生一次内存回收,就会被回收掉,不管是否满足还有没有空间。
虚引用
主要是给一个信号,做钩子函数。用来管理直接内存。
ThreadLocal 隔离。
7、cas (无锁化、自旋)
compare and set
cpu原语支持,ABA解决问题,加version。
cas(期望值、更新值) cas 主要是compareAndSwapInt不能被打断。
8、ReentrantLock
ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Synchronized,ReentrantLock增加了一些高级的扩展功能,比如它可以实现公平锁,同时也可以绑定多个Conditon。
9、countDownLatch
- countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
- 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。