本文主要是介绍Java多线程之原子性 volatile、atomicInteger、synchronized测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Java自增操作不是原子性操作,有三步:读,增,写;
AtomicInteger:一个提供原子操作的Integer的类。 一种线程安全的加减操作接口, 相比 synchroized、lock 高效.
synchroized:可以保证多线程下原子操作,不过效率低;
volatile:关键字,只能保证可见性,无法保证对变量的任何操作都是原子性的。
public class IncrementTest {public static int staticCounter = 0; //non-thread-safepublic static Counter synchronizedCounter = new Counter(); //synchronizedpublic static AtomicInteger atomicInteger = new AtomicInteger(0);volatile public static int volatileCounter = 0; //volatilepublic static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread() {public void run() {for (int j = 0; j < 10000; j++) {staticCounter++;synchronizedCounter.increment();atomicInteger.getAndIncrement();volatileCounter++;}}}.start();}while(Thread.activeCount()>1) //保证前面的线程都执行完Thread.yield();
// try {
// TimeUnit.SECONDS.sleep(5);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }System.out.println("non-thread-safe-> static staticCounter: " + staticCounter);System.out.println("synchronized Counter: " + synchronizedCounter.getValue());System.out.println("AtomicInteger: " + atomicInteger.intValue());System.out.println("nonatomic-> volatileCounter: " + volatileCounter);}}class Counter {private int value;public synchronized int getValue() {return value;}public synchronized int increment() {return ++value;}public synchronized int decrement() {return --value;}
}
这篇关于Java多线程之原子性 volatile、atomicInteger、synchronized测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!