先看代码:
import java.util.concurrent.atomic.AtomicInteger;
/**
*
* @author xialuomantian
*/
public class NewTest {
static volatile int a = 1;
static volatile int b = 1;
//static int a = 1;
//static int b = 1;
public static AtomicInteger aa = new AtomicInteger(0);
public static AtomicInteger bb = new AtomicInteger(0);
public static AtomicInteger ab = new AtomicInteger(0);
static void add() {
a++;
b++;
}
static synchronized void print() {
if (a > b) {
aa.getAndIncrement();
} else if (a < b) {
bb.getAndIncrement();
} if (a == b) {
ab.getAndIncrement();
}
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
for (int i = 0; i < 100000; i++) {
new Thread(() -> {
add();
print();
}).start();
}
System.out.println("a>b:" + aa);
System.out.println("b>a:" + bb);
System.out.println("a==b:" + ab);
}
}
再去掉volatile
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.mycompany.mytest;
import java.util.concurrent.atomic.AtomicInteger;
/**
*
* @author xialuomantian
*/
public class NewTest {
static int a = 1;
static int b = 1;
public static AtomicInteger aa = new AtomicInteger(0);
public static AtomicInteger bb = new AtomicInteger(0);
public static AtomicInteger ab = new AtomicInteger(0);
static void add() {
a++;
b++;
}
static synchronized void print() {
if (a > b) {
aa.getAndIncrement();
} else if (a < b) {
bb.getAndIncrement();
} if (a == b) {
ab.getAndIncrement();
}
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
for (int i = 0; i < 100000; i++) {
new Thread(() -> {
add();
print();
}).start();
}
System.out.println("a>b:" + aa);
System.out.println("b>a:" + bb);
System.out.println("a==b:" + ab);
}
}
下面是几种结果: