永刚的点滴成长

导航

 

1、线程创建的方式有哪几种

  1、继承Thread类;2、实现Runnable接口;3、实现Callable接口;4、使用Executor工具类创建线程池;5;使用ThreadPoolExecutor工具类创建线程池。

2、线程的5种状态流转

  线程的状态如下状态:新建、就绪、运行、【阻塞】(等待(时间片用尽)、主动等待、挂起)、销亡;新建一个线程开始调用start方法时会进入就绪状态,被操作系统调度会进入到运行态,如果时间片用完会或有休眠操作或进入同步代码块或IO阻塞进入等待或阻塞状态,以上这些场景满足的状态流转的条件下一个状态是就绪态,继续等待CPU的调度,线程执行完毕进入销亡阶段。

 

 3、线程池的常用参数

  ThreadPoolExecutor核心参数如下:corePoolSize、MaximumPoolSize、workQueue、keepAliveTime、rejectedExecutionHandler

4、ThreadPoolExecutor的饱和策略

5、AQS实现原理

  AQS(AbstractQueuedSynchronizer)是实现锁的基,即抽象队列同步器,里面定义了很多锁的方法,如ReentrantLock、ReentrantReadWriterLock,CountDownLatch、Semaphore都是基于AQS来实现的。AQS中维护了一个volatile int state代表共享资源和一个先进先出的等待队列,volatile修饰的能够在线程间可见,因此当state=1表示锁已经被占用,只能入队列等待锁资源,只有为0时才能经行锁的请求,state的变更有CAS保证安全性。

5、公平锁和非公平锁的区别

  从性能上来看非公平锁的性能优于公平锁,性能虽然较佳但有可能造成线程饥饿的情况,最坏的情况就是某线程一直被插队,但相对于性能的开销饥饿的场景就相对可以忽略,这也是ReentrantLock默认采用非公平锁的原因。

6、Condition的实现原理

  Condition是在jdk1.5后才出现的,是用来用来替代传统的wait和notify来实现线程间的协作,相比object的提供的方式Condition提供的方式更加的安全和高效。Condition可以精准的对不同条件进行控制,wait和notify只能对某个线程或全部线程操作,颗粒度较粗。Condition需要使用Lock进行控制,lock后要及时的unlock,Condition有类似await的机制,因此不会出现加锁方式而出现的死锁问题,也不会出现刚被唤醒又被挂起起的死锁问题。

7、Synchronized和ReentrantLock的区别

  0、底层实现方面:Synchronized属于JVM层面的锁,是Java关键字,通过monitor对象来完成monitorenter和monitorexit。对象只有在同步块和同步方法中才能使用wait和notify方法,ReentrantLock是java1.5才有的锁,属于API层面的锁。前者实现涉及无锁,偏向锁,自旋锁,向OS申请重量级锁,ReentrantLock则是通过CAS保证线程操作原子性和关键字volatile实现线程的变量的可见性来实现锁的功能。

  1、是否需要手动释放:前者不需要手动释放锁后者需要手动释放锁 ,否则会造成死锁。

  2、是否可中断:前者不可中断除非锁中的代码异常或正常退出,后者可以中断,可以通过trylock或者lockinterrupyibly中断。  

  3、是否公平:前者属于公平锁后者可以通过构造参数决定是否公平。

  4、是否可绑定Condition:

  5、锁的对象:前者锁的是 对象后者则是线程

8、CAS

  由Compare and Swap翻译而来,是乐观锁的实现,事先总是乐观的认为可以获取到锁,所以不断的循环尝试获取锁又成为自旋,相对这个乐观锁,synchronized就属于悲观锁,一旦获取锁其他的的线程必须挂起。乐观锁的获取锁是由操作系统保证的,CAH指令就是为此而生的。

posted on 2023-03-31 18:49  永刚的点滴成长  阅读(10)  评论(0编辑  收藏  举报