5、线程

具体参考:Java 并发常见知识点&面试题总结(基础篇) | JavaGuide

⾃旋锁、偏向锁、轻量级锁、重量级锁、乐观锁、悲观锁

⾃旋锁就是线程在获取锁的过程中,不会去阻塞线程 一直循环操作,如果没获取到锁就继续循环,如果获取到了就获取到了,不需要阻塞等其他操作。(自旋锁原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,)

偏向锁:顾名思义,它会偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁

轻量级锁:由偏向锁升级⽽来,当⼀个线程获取到锁后,此时这把锁是偏向锁,此时如果有第⼆个线程来竞争锁,偏向锁就会升级为轻量级锁

重量级锁:如果⾃旋次数过多仍然没有获取到锁,则会升级为重量级锁

 

创建线程的方式

1、继承Thread

2、实现Runnable

3、实现Callable

4、创建线程池:

java提供了Executor去创建

或者通过ThreadPoolExecutor去创建,就要注意到构造函数重要参数分析

java*线程池7个参数*简述

线程池参数详解:

1、corePoolSize: 核心线程数量,线程池中会存在这么多个线程,当线程数量(包含空闲线程)少于corePoolSize的时候,会优先创建新线程,可以设置allowCoreThreadTimeOut=true来让核心线程池中线程也移除

2、maximumPoolSize: 线程池的最大容量,线程池中的线程数量不得超过这么多个,除非阻塞队列设置为无界的

3、keepAliveTime: 空闲线程存活时间,线程空闲超过这个时间的时候就会销毁

4、unit: keepAliveTime的时间单位,分钟、秒等

5、workQueue: 线程工作队列,阻塞队列,线程池从这个队列中取线程,可以设置的队列类型(容量为:capacity): ArrayBlockingQueue:有界阻塞队列,当线程数量n:corePoolSize <= n < maximumPoolSize 且 n >= capacity :创建新线程处理任务 当:n >= maximumPoolSize 且 n >= capacity 拒绝线程 LinkedBlockingQueue: 无界队列,maximumPoolSize不起作用,会一直创建线程 SynchronousQuene: 不缓存任务,直接调度执行,线程数超过 maximumPoolSize 则直接拒绝线程 PriorityBlockingQueue: 带优先级的线程队列

6、handler: 拒绝策略,线程数量达到maximumPoolSize时的策略,默认提供了4种:

  AbortPolicy: 直接丢弃并抛出异常

  CallerRunsPolicy: 线程池没有关闭则直接调用线程的run方法

  DiscardPolicy: 直接丢弃任务

  DiscardOldestPolicy: 丢弃最早的任务,并尝试把当前任务加入队列

7、threadFactory: 创建线程时使用的工厂,可以对线程进行统一设置,如是否守护线程、线程名等

 

讲一下 JMM(Java 内存模型)

这里总结出java内存模型是在理解java内存模型的基础

由于cpu和主存存在数量级的速率差,就引入了高速缓存来解决,解决了速率差的问题,但又引入了数据一致性的问题。因此又抽象出内存模型,解决多线程共享内存数据一致性问题。

Volatile缓存可见性实现原理

主要是通过汇编lock前缀指令,锁定这块内存区域的缓存,并写回到主内存。

lock前缀指令的解释:

1、将当前处理器缓存行的数据立即写回到系统内存(主内存)。

2、其他cpu通过总线嗅探机制嗅探到数据的数据的修改,将自己对应的缓存设置为无效

3、从而达到数据的一致性

 

 

 

posted @ 2022-05-26 11:39  jason饼干大怪兽  阅读(25)  评论(0)    收藏  举报