atomic并发加加 用的是硬件的cas 原子性操作 不会有并发问题 速度还快
下面的代码是从《深入理解java虚拟机弄出来的》
import java.util.concurrent.atomic.AtomicInteger;
public class volatileTest {
public static AtomicInteger race = new AtomicInteger();
public static void increase(){
race.incrementAndGet();
}
private static final int THREAD_COUNT = 20;
public static void main(String[] args) throws InterruptedException {
Thread[] threads = new Thread[THREAD_COUNT];
for (int i = 0; i < THREAD_COUNT; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0;i<10000;i++){
increase();
}
}
});
threads[i].start();
}
System.out.println(Thread.activeCount());
//这里如果改打 结果就不准确了
while (Thread.activeCount()>1){
Thread.yield();
}
System.out.println(race);
}
}
atomic并发加是准确的
我直接跑不准确是因为主线程跑完了,其他加的线程还没跑完
改为下面代码
import java.util.concurrent.atomic.AtomicInteger;
public class volatileTest {
public static AtomicInteger race = new AtomicInteger();
public static void increase(){
race.incrementAndGet();
}
private static final int THREAD_COUNT = 20;
public static void main(String[] args) throws InterruptedException {
Thread[] threads = new Thread[THREAD_COUNT];
for (int i = 0; i < THREAD_COUNT; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0;i<10000;i++){
increase();
}
}
});
threads[i].start();
}
System.out.println(Thread.activeCount());
while (Thread.activeCount()>10){
//这里如果加race 那么只会跑一次 不知道什么情况
System.out.println("来了"+"此时是:"+race);
//System.out.println("来了"+"此时是:");
Thread.yield();
}
System.out.println(race);
Thread.sleep(200);
System.out.println(race);
}
}
先这样吧 我的水平太差里