JUC并发

    一、sleep和wait有什么区别

sleep通常用于暂停线程执行,wait通常用于线程间交互

二Java有多少种锁以及使用场景

1、公平锁:线程按照申请所得顺序来获取锁,然后有序执行

2、非公平锁:多个线程获取锁的顺序,不是先到先得的顺序,执行时无序的。

优点:非公平锁的性能高于公平锁

缺点:有可能造成线程饥饿(可能有线程很长一段时间获取不到锁)

Java中的非公平锁:sybchronized是非公平锁,ReentrantLock可以通过构造函数指定该锁是公平的,还是不公平的,默认不公平

3、读写锁:通过ReentrantReadWriteLOck类来实现

读锁:允许多个线程获取读锁,同时访问同一个资源

写锁:只允许一个线程获取写锁,不允许同时访问同一个资源

4、自旋锁:为了让线程等待,我们只需让线程执行一个自选,自旋次数默认10次

优点:避免了线程切换的开销。

缺点:挂起线程和恢复线程的操作需要转入内核态中完成,并发压力比较大

5、可重入锁:任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞。java中的可重入锁用ReentrantLock,synchronized修饰的方法和代码段

问:可重入锁如果加了两个,只释放了一把会出现什么问题

答:程序卡死,第二把锁没有解锁,线程不能出来

问:如果只加了一把锁,释放两次会出现什么问题

答:会报错,java.lang.llegalMonitorStateExcption

5000字 | 24张图带你彻底理解Java中的21种锁 (qq.com)

三、volatile关键字的作用及使用场景

1、保持可见性:该关键字确保对一个变量的更新对其他线程马上可见。

当一个变量被声明为volatile时,线程再写入变量是不会把值缓存在寄存器或者其他地方,而是会把值刷新回主内存

当其他线程读取该共享变量时,会从主内存重新获取最新值,而不是使用当前线程的工作内存中的值

2、避免了指令重排

volatile实现禁止了指令重排优化,避免多线程环境下程序出现乱序执行的情况

volatile实现禁止指令重排优化底层原理:(理解的不透彻)

通过内存屏障来实现,

阻止屏障两次的指令重排序

强制把写缓存区/高速缓存中的脏数据等写回主内存,或者让缓存相应的数据失效

3、不保证原子性

4、volatile的使用场景(单例模式)

如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的,同时还会禁止指令重排序

四、理解CAS 和 CAS的ABA问题

CAS可以保证变量操作的原子性

并发量不是很高的情况下,使用CAS要比锁机制更高

在线程对共享资源占用时间较短的情况下,使用CAS效率会更高

ABA问题

CAS在操作的时候会检查变量的值是否被更改过,如果没有则更新值,但是带来一个问题,最开始的值是A,接着变成B,最后又变成了A。经过检查这个值确实没有修改过,因为最后的值还是A,但是实际上这个值确实已经被修改过了。为了解决这个问题,在每次进行操作的时候加上一个版本号,每次操作的就是两个值,一个版本号和某个值,A——>B——>A问题就变成了1A——>2B——>3A。在jdk中提供了AtomicStampedReference类解决ABA问题,用Pair这个内部类实现,包含两个属性,分别代表版本号和引用,在compareAndSet中先对当前引用进行检查,再对版本号标志进行检查,只有全部相等才更新值。

CAS确定修改的值就是预期修改的值(在拿到这个值和修改过程中没有改操作),才去修改,加上版本号机制,版本号相同则更改,不同则有人操作过,则不更改

五、线程池

线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方法这样的处理方式写的同时更加明确线程池的运行规则,规避资源耗尽的风险

1、线程池的三大方法

单一线程(只能有一个线程在执行)

固定线程(设置最大可执行的线程数)

伸缩线程(可多可少,自行设置)

2、线程池有几个参数以及作用

corePoolSize(核心线程数)

maxmumPoolSize(最大核心线程数):一般设置为电脑的最大核数

keepAiveTime(空闲线程存活时间)

unit(过期时间单位)

workQueue(工作队列)

threadFactory(线程工厂)

handler(拒绝策略)

3、线程池的四种拒绝策略

AbortPolicy(中止策略)线程池会抛出异常并中止执行此任务

CallerRunPolicy:把任务交给添加此任务的main线程去执行

DiscardPolicy:忽略此任务,忽略最新的一个任务

DiscardOldestpolicy:忽略最早的任务,最先加入队列的任务

六、sybchronized和ReetranLock的区别

七、AQS的实现原理和场景分析

八、关于死锁

九、Atomic原子类

十、ThreadLocal是什么,ThreadLocal内存泄露问题

十一、IO密集型和CPU密集型的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值