多线程与高并发

174 阅读1分钟

基础概念

启动线程的三种方式?所谓的第三种他可能想说线程池

  • 一个进程里最小的一个执行单元叫线程
  • yield没有用过。什么场景需要用呢?

线程的状态

  • new
  • runnbale:ready running
  • blocked
  • waiting
  • timedWaiting
  • terminated 这个就不能在start了。
  • 关闭线程就是正常结束了。stop这个方法不要用。
  • 了解下interrupt
  • getStat()得到状态

synchronize

  • 锁 是 某个对象(不要用String Integer Long)。拿到锁能执行下面的代码(null能作为锁吗?)
  • synchronize方法和synchroniz(this)是等价的。
  • 静态方法是没有this的。在静态方法上synchronize等价于synchronize(T.class)
  • T.class 一般是单例的(classloader)。
  • synchronize可重入锁
  • 遇到异常 锁被释放

细节(hotspot)

  • 早期1.5之前,锁很重
  • 后来有了锁升级的概念。
  • synchronize(obj) 锁就是个对象。对象头中Mark Word第一个线程来的时候记录了线程的ID。(偏向锁)效率高。
  • 如果有线程来争用,升级为自旋锁(一个线程占着锁,另一个线程在旁边自旋。用户态不是内核态)10次以后升级为重量级锁
  • 加锁代码执行时间长用OS锁。时间短,线程数少用自旋锁

JUC同步工具

同步容器

线程池

高频面试加分项

Disruptor

单机性能最高的MQ