1、简介
不是线程安全,是内存安全,堆是共享内存,可以被所有线程访问。
当多个线程同时访问一个对象的时候,如果不借助额外的同步控制或者其它的协作操作,调用这个对象的行为都可以得到正确的结果,我们则称这个对象是线程安全的。
2、堆和栈
堆是进程和线程共有的空间,分全局堆和局部堆。全局堆是所有没有分配的空间,局部堆是分配给用户的空间。堆是操作系统在对进程初始化的时候分配的,运行的过程中也可以索要额外的内存。但是运行完毕需要归还给系统,要不然会造成内存溢出。
在java中,堆是java虚拟机所管理最大的内存,是所有线程共享的内存,在java虚拟机启动的时候创建。堆存在的目的是存放对象实例,几乎所有的对象和数组都是在堆中创建。
栈是线程独有的内存,保存其运行状态和局部自动变量。栈在线程开始的时候初始化,每个线程的栈相互独立,因此栈是线程安全的。操作系统在切换线程的时候,会自动切换栈。在高级语言中栈不需要显示的分配和释放。
3、补充
目前主流的操作系统都是多任务的,也就是多线程了,为了保证安全,每个进程只能访问自己的内存空间,而不能访问别的进程,这是由操作系统保证的。
每个进程的内存空间会有一个特殊的区域,叫做堆(内存),进程中的所有线程都可以访问该区域,这就是造成线程安全问题所在。