0
点赞
收藏
分享

微信扫一扫

线程内容二

大自然在召唤 2022-04-23 阅读 79
java

阻塞队列BlockingQueue

FIFO队列(先进先出):LinkedBlockingQueue,ArrayBlockingQueue

优先级队列:PriorityBlockingQueue

如果队列为空则take阻塞,直到队列中有内容为止

如果队列为满,则put将阻塞,直到队列有空闲位置为止

JVM内存模型三大特性

原子性:
一个操作是不可中断的,即使是多个线程一起执行的时候,一个操作一旦开始就不会被其他线程干扰。

可见性:
当一个线程修改了某一个共享变量的值,其他线程是否能立即知道这个修改动作。

有序性:
在本线程内观察,所有的操作都是有序的,在其他线程观察时,所有的操作的都是无序的。

线程安全的实现方式

不可变的对象一定是线程安全的,不需要在采取任何保障措施。多线程下尽量保证对象不可变来满足线程安全。

不可变的类型:
fianl关键字修饰的基本类型
String
枚举类型
包装类

synchronized和ReentrantLock

1.CAS:基于冲突检测的乐观并发策略

2.AtomicInteger:调用了CAS操作

3.ABA问题:一个变量初始值为A,被改成B后,又被改为A,会被误认为没被修改过。

锁优化

自旋锁:
让一个线程请求锁时,自旋一段时间,如果在这段时间能够获得锁,就可以避免进入阻塞状态。

锁消除:
对检测出不可能存在竞争上的共享数据的锁进行消除

锁粗化:
如果对同一对象反复进行加锁解锁操作会导致性能损耗,应较少的进行加锁

轻量级锁:
使用CAS操作避免重量级锁的互斥量开销

偏向锁:
偏向第一个获取锁对象的线程,让这个线程获取锁后不再需要进行同步操作

举报

相关推荐

0 条评论