AtomicInteger 常用的幾個方法
int addAndGet(int delta):以原子方式將實例中的值與輸入的值delta相加,並返回結果
boolean compareAndSet(int expect, int update):如果輸入的值expect等於預期值,就以原子方式把值設置爲update
int getAndIncrement():以原子方式獲取值之後,增加1
int getAndSet(int newValue):以原子方式獲取當前值,然後設置一個值
多線程對普通變量int的修改:會有併發問題
public class MyAtomicInteger {
int sum =0;
public static void main(String[] args) throws InterruptedException {
MyAtomicInteger myAtomicInteger = new MyAtomicInteger();
for (int i = 0; i < 100; i++) {
new Thread() {
@Override
public void run() {
int t = myAtomicInteger.sum;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
myAtomicInteger.sum = 1 + t;
}
}.start();
}
Thread.sleep(1000);
System.out.println(myAtomicInteger.sum);
}
}
結果:6
對volatile變量修改:
public class MyAtomicInteger3 {
volatile int sum =0;
public static void main(String[] args) throws InterruptedException {
MyAtomicInteger3 myAtomicInteger = new MyAtomicInteger3();
for (int i = 0; i < 100; i++) {
new Thread() {
@Override
public void run() {
int t = myAtomicInteger.sum;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
myAtomicInteger.sum = 1 + t;
}
}.start();
}
Thread.sleep(1000);
System.out.println(myAtomicInteger.sum);
}
}
結果:4
使用AtomicInteger的變量:
public class MyAtomicInteger2 {
AtomicInteger sum = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException {
MyAtomicInteger2 myAtomicInteger = new MyAtomicInteger2();
for (int i = 0; i < 100; i++) {
new Thread() {
@Override
public void run() {
int t = myAtomicInteger.sum.get();
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
myAtomicInteger.sum.incrementAndGet();
}
}.start();
}
Thread.sleep(1000);
System.out.println(myAtomicInteger.sum.get());
}
}
結果:100
AtomicInteger不僅操作簡單,並且能夠保證線程安全