每日一档之线程基本知识

127 阅读1分钟

启动线程的方式

  • 继承Thread
  • 实现Runnable
  • Lambda表达式
  • 线程池Executors.newCachedThread

线程的API理解

  • sleep
  • yield 让出一下CPU,返回就绪状态,进入等待队列
  • join 等待另一个线程的结束

线程状态

  • new
  • runnable
    • ready
    • running
  • 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

系统锁与自旋锁的选择

  • 加锁代码执行时间长,或者线程比较多用系统锁
  • 加锁代码执行时间短,或者线程数少用自旋锁