java 基本类型 线程安全_java的基本类型和i++线程安全性的深入解析
在java中,除了long和double的8個(gè)字節(jié)、64位比特的變量外,其他的基本變量都是原子性的。
java存儲模型要求獲取和存儲操作都為原子性,但是對于非volatile的long和double變量,jvm允許將64位的讀或?qū)憚澐譃閮蓚€(gè)32位的操作。
如果讀和寫發(fā)生在不同的線程,這種情況讀取一個(gè)非volatile類型long就可能會出現(xiàn)得到一個(gè)值的高32位和另一個(gè)值的低32位。
因此,即使你并不關(guān)心過期數(shù)據(jù),但僅僅在多線程程序中使用共享的、可變的long和double變量也可能是不安全的,除非將它們聲明為volatile,或者用鎖保護(hù)起來。
說起原子性的操作,是指讀和寫是原子性的,比如i=5;這個(gè)就是一個(gè)原子性的操作。
但是兩個(gè)原子性的操作合在一起進(jìn)行,就不一定是原子性的了,比如先讀后寫,那么就有可能在讀之后這個(gè)變量被修改過。
i++就是這樣的一個(gè)操作,先讀后寫,所以說整型變量是原子性的,不是說i++就是一個(gè)原子性的操作。
當(dāng)你使用for(int i=0; i<10000; i++){System.out.print(i)}
你會發(fā)現(xiàn),i到最后不會打印出10000,打印出8-9千左右。
但是在多線程的情況下,就算整型變量是原子性的,也有可能會出現(xiàn)線程安全的問題,這個(gè)是線程可見性的問題,所以需要加上volatile聲明才行,
該修飾符是強(qiáng)制變量每次從內(nèi)存中讀取,而不會存儲在寄存器中。
總結(jié)
以上是生活随笔為你收集整理的java 基本类型 线程安全_java的基本类型和i++线程安全性的深入解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乌梅多少钱啊?
- 下一篇: 《醉玲珑》凤卿尘是巫女么 第几集怀孕结局