i++原子性问题:
- int temp = i;
- i = temp;
- i = i + 1;
中间可能会被其他线程抢走CPU时间片,造成重复赋值,要解决该问题,可以采取加上synchronized锁,但会影响效率。
i++会发生多线程安全问题,而原子变量采用CAS算法,可以避免该问题发生,提高效率。
原子变量位于java.util.concurrent.atomic包下,采用原子变量可以避免原子性问题。用法跟原来的包装类相仿。
package JUC;
import java.util.concurrent.atomic.AtomicInteger;
public class TestAtomic {
public static void main(String[] args) {
TestAtomThread ta = new TestAtomThread();
for (int i = 0; i < 10; i++) {
new Thread(ta).start();
}
}
}
class TestAtomThread implements Runnable {
AtomicInteger count = new AtomicInteger();
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getCount());
}
public int getCount() {
return count.getAndIncrement();
}
public void setCount(AtomicInteger count) {
this.count = count;
}
}