上一篇说到volatile只有内存可见行,没有原子性。 juc为我们提供了一些原子变量。
———————-代码举例——————-
package com.fjf.juc;
/**
* i++ 不具有原子性。 读 修改 写
*
* volatile 能保证内存可见性,并不能保证原子性
* @author Administrator
*
*/
public class TestAtomic {
public static void main(String[] args) {
Atomictd atomictd = new Atomictd();
for (int i = 0; i <10; i++) {
new Thread(atomictd).start();
}
}
}
class Atomictd implements Runnable{
private volatile int num = 0;
@Override
public void run() {
try {
Thread.sleep(300);
System.out.println(num++);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
—————-
修改为原子变量后,可保证其原子性。
————–
总结:
原子变量 1.利用volatile保证可见性2.利用cas算法(compare-and-swap)来保证原子性。