主要内容
- volatile关键字
- 算法题:找出出现次数超过一半的数
volatile关键字
几个相关的基础概念
共享变量:共享变量是指能够同时被多个线程访问到的变量,共享变量是存放在堆中的,而所有方法内的临时变量都不是共享变量。
重排序:重排序是为了提高指令的运行效率,在编译时或运行时堆指令的执行顺序进行调整的机制。指令重排序都遵循”as-if-serial”语意,即不管怎么重排序,单线程的执行结果不能被改变。
可见性:内存的可见性是指线程之间的可见性,一个线程的修改状态对另外一个线程时可见的。比如当线程A去修改了共享变量flag后,线程B去读共享变量flag一定读取到的是最新修改的flag。共享变量的可见性不是理所当然的,很多时候因为计算机内部的的cache和指令重排序的影响是不能保证可见性的。
volatile的原理
volatile修饰的变量不允许线程内部cache缓存和重排序,线程读取数据的时候直接读取内存,同时volatile不会对变量加锁,因此性能会比synchronized好。
还有一种说法是:读取一个volatile关键字会使相应的处理器执行刷新处理器缓存的动作,写一个volatile关键字会使得相应的处理器执行冲刷处理器缓存的动作。
算法题:找出出现次数超过一半的数
题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0
解法:
1 | public int MoreThanHalfNum_Solution(int [] array) { |