当int类型到达2147483647时,在+1操作,会得到什么值?该值是否可以用于路由的轮询操作?
1. int类型到达2147483647的+1操作
image.png当达到2^31-1
时,在+1操作,得到的是-2^31
。
2. 0x7FFFFFFF的&操作
该操作保证了2^31-1
时,在+1操作后依旧从0开始。
3. 正数原子递增器实现原理
- 原子性:要保证操作是原子的,线程安全的,java的atomatic包里的AtomicInteger符合这种要求;
- 正数性:数字在java中是用补码进行表示的,第一位为符号位,0代表正数,1代表负数,可以对递增的数值进行与0x7FFFFFFF(int类型,4个字节)操作,保证永远为正数。当递增超过0x7FFFFFFF时,又会从0开始递增;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 正数的原子递增器,主要用于实现轮询
*
*/
public class PositiveAtomicCounter {
private static final int MASK = 0x7FFFFFFF;
private final AtomicInteger atom;
public PositiveAtomicCounter() {
atom = new AtomicInteger(0);
}
public final int incrementAndGet() {
return atom.incrementAndGet() & MASK;
}
public final int getAndIncrement() {
return atom.getAndIncrement() & MASK;
}
public int get() {
return atom.get() & MASK;
}
public static void main(String[] args) {
AtomicInteger atom = new AtomicInteger(2147483647);
System.out.println(atom.incrementAndGet() & MASK);
}
}
网友评论