在学习并发的过程中,用“Boolean bool = true”的自动装箱方式初始化了两个对象锁去锁两块代码,结果运行的时候出现了竞争等待,调试了一下发现两个锁变量指向的是同一个对象,由此可见我对自动拆装箱的机制想的太简单了,查了一下,发现这个机制还挺细节,那就记录一下:
本文主要有以下几个方面:
- 什么是自动拆装箱
- 拆装箱的实现
- 拆装箱发生的场景
- 关于String
- 回首望月
尝试的第一篇博客,不当之处,求轻喷!
一. 什么是自动拆箱与装箱
我们都知道,Java定义了8种基本类型和与之对应的8中包装器,其中6种数据类型,1种字符类型以及1种布尔类型: 
在Java5之前,定义生成一个Integer包装器类型的对象,只能通过以下方式:
1 Integer i = new Integer(0);
Java5支持了基本类型和对应的包装类型之前的自动转换机制,即自动拆箱(包装器类型转换成基本类型)与装箱(基本类型封装成包装器类型)。于是,就有了以下两行代码:
1 Integer i = 0; //自动装箱2 int j = i; //自动拆箱
二. 自动拆装箱的实现(int-Integer为例)
我们将下面自动拆装箱的代码反编译一下,拆装箱的动作就一目了然。
1 public class MainTest { 2 public static void main(String[] args) { 3 Integer i = 0; 4 int j = i; 5 } 6 }
编译后:

通过反编译的结果看,在"Integer i = 0"自动装箱的过程中,调用了Integer.valueOf(int i)方法;在"int j = i;"的自动装箱的过程中,调用了Integer.intValue()方法。
其中,拆箱方法Integer.intValue()方法很简单:

