java面试题(21)对线程安全的理解

本文探讨了内存安全的重要性,区分了Java堆和栈,以及它们在多线程环境中的作用。特别强调了堆作为共享内存带来的线程安全问题和操作系统对内存隔离的保障。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、简介

  不是线程安全,是内存安全,堆是共享内存,可以被所有线程访问。
  当多个线程同时访问一个对象的时候,如果不借助额外的同步控制或者其它的协作操作,调用这个对象的行为都可以得到正确的结果,我们则称这个对象是线程安全的。

2、堆和栈

  是进程和线程共有的空间,分全局堆和局部堆。全局堆是所有没有分配的空间,局部堆是分配给用户的空间。堆是操作系统在对进程初始化的时候分配的,运行的过程中也可以索要额外的内存。但是运行完毕需要归还给系统,要不然会造成内存溢出。
  在java中,堆是java虚拟机所管理最大的内存,是所有线程共享的内存,在java虚拟机启动的时候创建。堆存在的目的是存放对象实例,几乎所有的对象和数组都是在堆中创建。
  是线程独有的内存,保存其运行状态和局部自动变量。栈在线程开始的时候初始化,每个线程的栈相互独立,因此栈是线程安全的。操作系统在切换线程的时候,会自动切换栈。在高级语言中栈不需要显示的分配和释放。

3、补充

  目前主流的操作系统都是多任务的,也就是多线程了,为了保证安全,每个进程只能访问自己的内存空间,而不能访问别的进程,这是由操作系统保证的。
  每个进程的内存空间会有一个特殊的区域,叫做堆(内存),进程中的所有线程都可以访问该区域,这就是造成线程安全问题所在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值