当我们初学Java多线程概念的时候,其实总是有些疑惑,为什么基本数据类型不能加锁?以及i++为什么是一个线程不安全的操作,从直觉来说,基本数据类型不能加锁这个问题,似乎很好理解,无非是数值本身是没办法当作一把锁的,就像你家隔壁的大黄要用绳子拴住,而不能用一根头发拴住,虽然牛头不对马嘴,但是至少不是那么让人难以理解
但是i++为啥是线程不安全呢?从直觉来说,多线程这种操作就好像是本来一个人干的活,好几个人一起干,因为人多了,所以出现了许多问题,比如你想拆西墙补东墙,具体步骤应该是拆西墙一块砖,然后补给东墙,但是因为人太多,最后东墙拆完了,但是有几个人还不知道,不知道从哪里找来了几块墙给你补上了,但是无论如何,那块砖是不会变的,i++属于线程不安全就好像是,你搬砖搬的好好的,砖没了,或是你手上的砖突然变成两块了,这显然与我们想象中的不太一样
其实我们把砖头这个概念抽象一下,我们可以把他理解为一个不可分割的最小操作,用专业术语来说就是一个原子性操作,i++是一个原子性操作吗?人家好像真不是一个原子性操作,我们把i++捋一捋,其实i++可以分成以下几步操作,i+1,然后把i+1赋值给i,实际上把i++这种操作放到字节码中查看,其实上也差不多是这么一个意思