java中的Volatile与Atomics

来源:互联网 发布:saas软件合同模板 编辑:程序博客网 时间:2024/05/16 11:48

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);}}



0 0