| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Java 多线程介绍2 -> 正文阅读 |
|
[Java知识库]Java 多线程介绍2 |
指令重排序一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。 volatilevolatile的深入介绍
volatile原理在java 的内存模型里面(JMM)。临时变量会被每个线程从主内存中读取一份放到自己的高速缓存中。单线程的时候不会出现问题,单当多个线程的时候就会出现可见性问题。 例如,线程A与线程B都想对变量o = 0进行加1, 结果应当是2。 但是由于这两个线程都把o复制到了自己的高速缓存中,都是在0的基础上加一, 导致最后的结果等于1。 实现原理
volatile保证原子性吗public volatile int inc = 0; volatile主要保证的是可见性,并不保证原子性。在多个线程进行inc++时,是保证不了inc执行正确的,因为累计并不是原子操作, 实现累计原子性的方法有:
volatile能保证有序性吗?volatile会禁止重排序,所有在一定程度上保证有序性。
使用volatile关键字的场景synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。通常来说,使用volatile必须具备以下2个条件:
实际上,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。 事实上,我的理解就是上面的2个条件需要保证操作是原子性操作,才能保证使用volatile关键字的程序在并发时能够正确执行。 下面列举几个Java中使用volatile的几个场景。 1.状态标记量
2.double check
Synchronized 与ReenTrantLock的区别
线程组线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织
重入锁这里的重入锁是指java.util.conurrent.locks.Reentrant。 Reentrant是可以完全替代synchronized的。
公平锁非公平锁,是哪个线程抢到就是哪个的,会产生饥饿问题,效率相对较高, |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 19:20:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |