JVM线程模型
jvm线程与操作系统线程之间存在某种映射关系,这两种不同维度的线程之间的规范和协议就是线程模型
三种线程模型:
1对1:java线程与操作系统线程1对1关系
多对1:多个用户线程映射到一个内核线程上,用户线程调度需要用户空间完成
多对多:多个用户线程映射到多个内核线程上。
乐观锁与悲观锁
并发环境中,出现多个线程对统一资源进行争抢的情况,两个线程同时对资源进行修改,会导致数据不一致的情况,为了解决这个问题,使用锁机制
乐观锁:乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)
悲观锁:悲观锁有点像是一位比较悲观(也可以说是未雨绸缪)的人,总是会假设最坏的情况,避免出现问题 (认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。)
对象锁:四种状态
无锁、偏向锁、轻量级锁、重量级锁
JUC
JUC中大量组件以及一些开源中间件都依赖AQS
Reentrantlock:可重入锁
countDownLatch:线程计数器
threadPoolExcutor:线程池
concurrentHashMap:哈希表