杂谈-Java中为什么基本数据类型不能加锁,i++为什么是一个线程不安全的操作

博客探讨了Java中基本数据类型不能加锁的原因,强调数值本身无法作为锁的实体。同时,解释了i++在多线程环境下为何是线程不安全的,通过类比说明在并发操作中可能出现的问题。文章指出i++操作非原子性,并分析了Java锁的实现原理,指出锁存在于对象头中,而基本数据类型缺乏存放锁的空间,因此无法加锁。

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

当我们初学Java多线程概念的时候,其实总是有些疑惑,为什么基本数据类型不能加锁?以及i++为什么是一个线程不安全的操作,从直觉来说,基本数据类型不能加锁这个问题,似乎很好理解,无非是数值本身是没办法当作一把锁的,就像你家隔壁的大黄要用绳子拴住,而不能用一根头发拴住,虽然牛头不对马嘴,但是至少不是那么让人难以理解

但是i++为啥是线程不安全呢?从直觉来说,多线程这种操作就好像是本来一个人干的活,好几个人一起干,因为人多了,所以出现了许多问题,比如你想拆西墙补东墙,具体步骤应该是拆西墙一块砖,然后补给东墙,但是因为人太多,最后东墙拆完了,但是有几个人还不知道,不知道从哪里找来了几块墙给你补上了,但是无论如何,那块砖是不会变的,i++属于线程不安全就好像是,你搬砖搬的好好的,砖没了,或是你手上的砖突然变成两块了,这显然与我们想象中的不太一样

其实我们把砖头这个概念抽象一下,我们可以把他理解为一个不可分割的最小操作,用专业术语来说就是一个原子性操作,i++是一个原子性操作吗?人家好像真不是一个原子性操作,我们把i++捋一捋,其实i++可以分成以下几步操作,i+1,然后把i+1赋值给i,实际上把i++这种操作放到字节码中查看,其实上也差不多是这么一个意思

 		 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值