多线程操作i++

原子操作

“不可中断的一个操作,或者一系列操作”–原子操作,一个操作要么成功要么失败,没有中间状态。

Java中的count++

1.Java中count++C++count++操作不一样,在Java中此操作不是原子操作,包含了三个步骤:取值->修改->写入。

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void test() {
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 100; j++) {
increase();
}
}
}).start();
}
}

private void increase() {
count++;
Log.d("MainActivity", count + "");
}

上述代码,我们希望最终的打印结果为300,可是实际上,输出的结果是小于300。原因是count++并不是原子操作,那么通过哪几种方法可以得到预期的结果呢?

synchronized加锁

通过synchronized关键字,将并行变成了串行操作,方法过重,效率低下。

1
2
3
4
private synchronized void increase() {
count++;
Log.d("MainActivity", count + "");
}

ReentrantLock重入锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private  void test() {
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 100; j++) {
lock.lock();
try {
count++;
Log.d("MainActivity", count + "");
} finally {
lock.unlock();
}
}
}
}).start();
}
}

AtomicIntegerJava自带原子操作类

1
2
3
4
private void increase() {
atomicInteger.incrementAndGet();
Log.d("MainActivity", count + "");
}
这个功能是摆设,看看就好~~~