线程内容二

阻塞队列BlockingQueue

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

优先级队列:PriorityBlockingQueue

阻塞队列提供了take和put方法:

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

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

JVM内存模型三大特性

原子性,可见性,有序性

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

实现:AtomicInteger,synchronized互斥锁

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

实现:volatile synchronized final

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

实现:volatile关键字禁止指令重排,synchronized

线程安全的实现方式

1.不可变

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

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

互斥同步

synchronized和ReentrantLock

非阻塞同步

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

2.AtomicInteger:调用了CAS操作

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

锁优化

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值