线程安全的定义?当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果 , 那这个对象就是线程安全的 。
Java语言操作的共享数据,包括哪些?
- 不可变
- 绝对线程安全
- 相对线程安全
- 线程兼容
- 线程对立
如何实现线程安全?虚拟机提供了同步和锁机制 。
- 阻塞同步(互斥同步)
- 非阻塞同步
- 如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁,把锁的计数器+1;当执行monitorexit指令时将锁计数器-1 。当计数器为0时,锁就被释放了 。
- 如果获取对象失败了,那当前线程就要阻塞等待,知道对象锁被另外一个线程释放为止 。
等待可中断:当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待 , 对处理执行时间非常长的同步块很有用 。
公平锁:多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁 。synchronized中的锁是非公平的 。
非阻塞同步互斥同步最大的问题 , 就是进行线程阻塞和唤醒所带来的性能问题,是一种悲观的并发策略 。总是认为只要不去做正确的同步措施(加锁),那就肯定会出问题 , 无论共享数据是否真的会出现竞争,它都要进行加锁、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要被唤醒等操作 。
随着硬件指令集的发展,我们可以使用基于冲突检测的乐观并发策略 。先进行操作,如果没有其他线程征用数据,那操作就成功了;如果共享数据有征用,产生了冲突 , 那就再进行其他的补偿措施 。这种乐观的并发策略的许多实现不需要线程挂起,所以被称为非阻塞同步 。
锁优化是在JDK的那个版本?JDK1.6的一个重要主题,就是高效并发 。HotSpot虚拟机开发团队在这个版本上 , 实现了各种锁优化:
- 适应性自旋
- 锁消除
- 锁粗化
- 轻量级锁
- 偏向锁
自旋锁的原理?如果物理机器有一个以上的处理器,能让两个或以上的线程同时并行执行,让后面请求锁的线程稍等一会 , 但不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放 。为了让线程等待 , 我们只需让线程执行一个忙循环(自旋) 。
自旋的缺点?自旋等待本身虽然避免了线程切换的开销,但它要占用处理器时间 。所以如果锁被占用的时间很短,自旋等待的效果就非常好;如果时间很长,那么自旋的线程只会白白消耗处理器的资源 。所以自旋等待的时间要有一定的限度,如果自旋超过了限定的次数仍然没有成功获得锁,那就应该使用传统的方式挂起线程了 。
什么是自适应自旋?自旋的时间不固定了,而是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定 。
推荐阅读
- JVM学习笔记——垃圾回收篇
- 雾境序列荒林回响主线3
- 网吧怎么玩明日之后(网吧怎么登录明日之后pc)
- 低配电脑怎么玩明日之后(电脑如何玩明日之后)
- 【Java复健指南09】项目练习全解--房屋出租系统
- 【Bluetooth蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程
- 【Bluetooth|蓝牙开发】二、蓝牙开发入门
- 【深入浅出 Yarn 架构与实现】1-1 设计理念与基本架构
- 原神香醉坡兰那罗在哪
- 黑莓q5用安装微信的方法a 用黑莓自带的印象笔记手敲的 看不懂的宝宝们在私聊我吧