如你们所知,想在java行业拿到高薪,多线程是个必须熟练的技能,可是入门费劲,故最近搜集关于多线程的资料,做如下总结。
1.锁有哪些实现。
jdk1.5之前有synchronized,jdk1.5+后有ReentrantLock,ReentrantReadAndWriterLock,countDownLatch,CycliBarrier。
2.线程启动过程分析
线程的启动,大家都知道是start,这时候线程会向内存申请一些资源准备(线程工作栈所需要的内存等),然后等待cpu空闲下来调度,这时候会执行run,直到线程销毁。
3.线程内存模型
线程有工作空间,有线程工作变量,线程A变量修改了,线程B并不能读到修改的值,只有当线程A把工作变量刷到共享内存变量,才能共享给B,谈到这里就不得不提一下volatitle,volatitle修饰的变量,会把线程工作变量强刷到共享内存,这样就能保证其他线程读到最新的变量了。
4.线程上下文切换
众所都知,线程执行的效率靠的是cpu的调度,当线程没有执行完,或是sleep,或是wait,cpu需要记住此刻的线程变量等上下文,然后切换执行其他线程,当再次切换回来的时候,需要根据线程上下文继续未完的步骤,所以线程越多,cpu越忙,导致cpu狂飙100%
5.wait,sleep区别
wait 线程会堵塞,释放锁,让出cpu,等待notify,notifyall唤醒。
sleep线程会休眠一段时间,不释放锁,让出cpu调度其他任意优先级的等待调度的线程。
6.yield, join区别
yield会让线程让出cpu给另外一个同样优先级的线程。join是让其他线程等待当前线程执行完。