当多个线程访问同一个对象时,如果不用做额外的控制,调用这个对象的行为都可以获得正确的结果,就说这个对象是线程安全的。
线程安全准确地说是内存安全,堆是共享内存,可以被所有线程访问。
在每个进程的内存空间都会有一块特殊的公共区域,即堆(内存)。进程内的所有线程都可以访问到该区域,这就是造成问题的潜在原因。
在Java中,堆是Java虚拟机所管理的内存中最大的一块,是所有线程共享的一块内存区域,在虚拟机启动时创建。堆所存在的内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
栈是每个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此栈是线程安全的。操作系统在切换线程的时候会自动切换栈。