package com.index.thinking;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
/*
* i 的初始值是0,每次递增2,所以i的所有的值都应该是偶数,如果不是,就是出错了
*/
public class AtomicityTest implements Runnable {
/*
* 这是一个错误的写法,会出现i的值是奇数的情况
*/
private volatile int i = 0;
public int getValue() {
return i;
}
private synchronized void evenIncrement() {
i++;
i++;
}
/*
* 方法一,一个比较原始的做法,效率比较低
*/
// private volatile int i = 0;
// public synchronized int getValue(){
// return i;
// }
// private synchronized void evenIncrement(){
// i++;
// i++;
// }
/*
* 方法二,一个比较新的做法,本次测试的结果显示,速度是方法一的12~14倍
*/
// private AtomicInteger i = new AtomicInteger();
// public synchronized int getValue(){
// return i.get();
// }
// private void evenIncrement(){
// i.addAndGet(2);
// }
@Override
public void run() {
while (true) {
evenIncrement();
}
}
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
AtomicityTest at = new AtomicityTest();
exec.execute(at);
Long start = System.currentTimeMillis();
while (true) {
int val = at.getValue();
if (val % 2 != 0) {
System.out.println(val);
System.exit(0);
}
if (val > 100000000) {
Long end = System.currentTimeMillis();
System.out.println(end - start + " ************************");
System.exit(0);
}
}
}
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
/*
* i 的初始值是0,每次递增2,所以i的所有的值都应该是偶数,如果不是,就是出错了
*/
public class AtomicityTest implements Runnable {
/*
* 这是一个错误的写法,会出现i的值是奇数的情况
*/
private volatile int i = 0;
public int getValue() {
return i;
}
private synchronized void evenIncrement() {
i++;
i++;
}
/*
* 方法一,一个比较原始的做法,效率比较低
*/
// private volatile int i = 0;
// public synchronized int getValue(){
// return i;
// }
// private synchronized void evenIncrement(){
// i++;
// i++;
// }
/*
* 方法二,一个比较新的做法,本次测试的结果显示,速度是方法一的12~14倍
*/
// private AtomicInteger i = new AtomicInteger();
// public synchronized int getValue(){
// return i.get();
// }
// private void evenIncrement(){
// i.addAndGet(2);
// }
@Override
public void run() {
while (true) {
evenIncrement();
}
}
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
AtomicityTest at = new AtomicityTest();
exec.execute(at);
Long start = System.currentTimeMillis();
while (true) {
int val = at.getValue();
if (val % 2 != 0) {
System.out.println(val);
System.exit(0);
}
if (val > 100000000) {
Long end = System.currentTimeMillis();
System.out.println(end - start + " ************************");
System.exit(0);
}
}
}
}