Volatile
Volatile保证在变量在多线程的可见性。用于修饰变量。
代码如下:
public class VolatileDemo1 {
volatile int a;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void testA1(final VolatileDemo1 vd){
Thread thread = new Thread(){
public void run() {
for (int i=1; i<5; i++) {
vd.setA(i);
System.out.println("我被修改为:" + vd.getA());
}
}
};
thread.start();
}
public void testA2(final VolatileDemo1 vd){
Thread thread = new Thread(){
public void run() {
System.out.println("我获取到的值:" + vd.getA());
}
};
thread.start();
}
public static void main(String[] args) {
VolatileDemo1 vd1 = new VolatileDemo1();
vd1.testA1(vd1);
vd1.testA2(vd1);
}
}
Atomics
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicsDemo {
private AtomicInteger atomicCount = new AtomicInteger();
private int count = 0;
public int increase() {
synchronized (this) {
count = count + 1;
return count;
}
}
public int decrease() {
synchronized (this) {
count = count - 1;
return count;
}
}
public int atomicIncrease() {
return atomicCount.incrementAndGet();
}
public int atomicDecrease() {
return atomicCount.decrementAndGet();
}
public static void main(String[] args) throws InterruptedException {
long startTime = System.currentTimeMillis();
final AtomicsDemo ad = new AtomicsDemo();
for (int i=0; i<1000; i++) {
Thread thread = new Thread(){
public void run() {
ad.increase();
//ad.atomicIncrease();
}
};
thread.start();
}
TimeUnit.SECONDS.sleep(3);
System.out.println("时间:" + (System.currentTimeMillis() - startTime));
System.out.println("count大小:" + ad.count);
System.out.println("atomicCount大小:" + ad.atomicCount);
System.out.println("=========");
long startTime2 = System.currentTimeMillis();
//final AtomicsDemo ad = new AtomicsDemo();
for (int i=0; i<1000; i++) {
Thread thread = new Thread(){
public void run() {
//ad.increase();
ad.atomicIncrease();
}
};
thread.start();
}
TimeUnit.SECONDS.sleep(3);
System.out.println("时间:" + (System.currentTimeMillis() - startTime2));
System.out.println("count大小:" + ad.count);
System.out.println("atomicCount大小:" + ad.atomicCount);
}
}