每日一档之线程基本知识
启动线程的方式
- 继承Thread
- 实现Runnable
- Lambda表达式
- 线程池Executors.newCachedThread
线程的API理解
- sleep
- yield 让出一下CPU,返回就绪状态,进入等待队列
- join 等待另一个线程的结束
线程状态
- new
- runnable
- timedWating <--- wait(time)/join()/
- waiting <--- wait()/join()/park()
- blocked <--- synchronized
- teminated
synchronized关键字
- 多个线程同时抢夺同一资源的时候
- JVM规范没有规定,hotspot是在对象的markWord(64位)的前2位表示
- 保证了原子性和可见性,有它可以不加volatile
- 可重入锁
- 程序中出现异常,默认会释放锁,这会导致程序乱入,要加catch处理
- 底层实现(hotspot实现)
- 锁升级后不可逆转
- JDK早期是重量级,需要找OS申请
- 改进为锁升级的过程 --> 《我就是厕所长》文章
Class文件是否是单例
- 如果是在一个ClassLoader,那指定是单例的
- 不同的ClassLoader无法相互访问
- 一个进程可以有多个classLoader
系统锁与自旋锁的选择
- 加锁代码执行时间长,或者线程比较多用系统锁
- 加锁代码执行时间短,或者线程数少用自旋锁