谈谈对线程安全的理解
线程安全可以理解为内存安全,堆是内存共享,可以被所有的内存访问。
当多个线程访问同一个对象时,如果不进行额外的同步控制或者其他的协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象时线程安全的。
堆是进程和线程共有的空间,分全局堆和局部堆,全局堆就是所有没有分配的空间,局部堆就是用户分配的空间,堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是用完了要还给系统,不然就是内存泄漏。
在java中,堆是java虚拟机所管理的内存中最大的一块,是所有线程共享的一款线程区域,在虚拟机启动时创建,堆所存在的内存区域唯一目的就是存放对象实例,几乎多有的对象实例和数组都放在堆中。
栈是每个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,栈是线程安全的。操作系统在切换线程的时候回自动切换栈,栈空间不需要再高级语言里显式的分配和释放。
在每个进程的内存空间都有一块特殊的公共区域,通常称为堆内存,进程内多有的线程都可以访问该区域,这就是造成问题的潜在原因。