在写一个线程同步的demo的时候,想用Integer作为对象传入各个Runnable中作为flag,自增,然后发现失败,探究原因后记录如下:

    1. public class Main {
    2. public static void main(String[] args) {
    3. Integer i = 10;
    4. Integer j = i++;
    5. System.out.println(i == j);
    6. }
    7. }

    输出:false

    原因:

    Integer中表示值的变量value本身就是一个final类型的,即不可变类型,不可重新赋值。

    1. private final int value;

    那么当Integer++时,只能去重新创建一个Integer对象,获取从缓存中IntegerCache这个数组缓存中取出现成的Integer对象。

    Integer++时,首先调用intValue()自动拆箱

    1. public int intValue() {
    2. return value;
    3. }

    返回的value自增后,用valueOf(int i)自动装箱,然后返回一个新的Integer对象。

    1. public static Integer valueOf(int i) {
    2. if (i >= IntegerCache.low && i <= IntegerCache.high)
    3. return IntegerCache.cache[i + (-IntegerCache.low)];
    4. return new Integer(i);
    5. }

    i的值在区间[IntegerCache.low , IntegerCache.high]时,返回IntegerCache.cahce这个静态数组中的元素。

    1. private static class IntegerCache {
    2. static final int low = -128;
    3. static final int high;
    4. static final Integer cache[];//静态数组
    5. //静态代码块中直接初始化了静态数组。
    6. static {
    7. // high value may be configured by property
    8. int h = 127;
    9. String integerCacheHighPropValue =
    10. sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
    11. if (integerCacheHighPropValue != null) {
    12. try {
    13. int i = parseInt(integerCacheHighPropValue);
    14. i = Math.max(i, 127);
    15. // Maximum array size is Integer.MAX_VALUE
    16. h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
    17. } catch( NumberFormatException nfe) {
    18. // If the property cannot be parsed into an int, ignore it.
    19. }
    20. }
    21. high = h;
    22. cache = new Integer[(high - low) + 1];
    23. int j = low;
    24. for(int k = 0; k < cache.length; k++)
    25. cache[k] = new Integer(j++);
    26. // range [-128, 127] must be interned (JLS7 5.1.7)
    27. assert IntegerCache.high >= 127;
    28. }
    29. private IntegerCache() {}
    30. }

    结论:在int取值为[-128 , 127]时,从静态数组中直接取出现有的Integer对象。不在这个区间时,直接new出Integer对象。