㈠ java的原子數據類型有哪些
選B了!
原子類型就是基本數據類型。一共有八種:
byte
short
int
long
char
boolean
float
double
String也可以算,也可以不算。既可以用
String
str="...";來定義,也可以用
String
str=new
String("...");來定義
㈡ java 程序中怎麼保證多線程的運行安全
並發編程三要素(線程的安全性問題體現在):
原子性:原子,即一個不可再被分割的顆粒。原子性指的是一個或多個操作要麼 全部執行成功要麼全部執行失敗。
可見性:一個線程對共享變數的修改,另一個線程能夠立刻看到。 (synchronized,volatile)
有序性:程序執行的順序按照代碼的先後順序執行。(處理器可能會對指令進行 重排序)
出現線程安全問題的原因:
線程切換帶來的原子性問題
緩存導致的可見性問題
編譯優化帶來的有序性問題
解決辦法:
JDK Atomic開頭的原子類、synchronized、LOCK,可以解決原子性問題
synchronized、volatile、LOCK,可以解決可見性問題
Happens-Before 規則可以解決有序性問題
㈢ java的原子性操作有哪些
Java中的原子操作包括:
1)除long和double之外的基本類型的賦值操作
2)所有引用reference的賦值操作
3)java.concurrent.Atomic.* 包中所有類的一切操作
count++不是原子操作,是3個原子操作組合
1.讀取主存中的count值,賦值給一個局部成員變數tmp
2.tmp+1
3.將tmp賦值給count
可能會出現線程1運行到第2步的時候,tmp值為1;這時CPU調度切換到線程2執行完畢,count值為1;切換到線程1,繼續執行第3步,count被賦值為1------------結果就是兩個線程執行完畢,count的值只加了1;
還有一點要注意,如果使用AtomicInteger.set(AtomicInteger.get() + 1),會和上述情況一樣有並發問題,要使用AtomicInteger.getAndIncrement()才可以避免並發問題
㈣ java中什麼是原子對象
不能被分開操作的一段代碼,就叫原子對象。。
比如,你在ATM取款機取錢,ATM程序中吐錢跟在你賬戶上扣掉等額的數目就是一個原子性的操作,這兩個動作一定要連在一起操作,要麼都成功,要麼都失敗,不可以被分開只執行某一部分。
像這樣的操作,我們叫它原子操作。
吐錢跟賬戶上扣錢這兩個行為對象是嚴格合為一體的,不可以被分開,我們稱這樣的對象為原子對象
㈤ 在java中,什麼是原子性
:原子性,就是不會有中間狀態存在,要麼什麼都沒改變,要麼全都改變。不會有一部分沒改變,一部分改變了。 引用賦值,或者說所有賦值操作都不是原子性的。 對應的原子類是AtomicReferenc。類似的也有AtomicLong之類的原子類,來保證賦值的原子性
㈥ Java是怎麼保證原子性,可見性
首先,要知道原子性和可見性是在並發環境需要思考的問題,所以下面的回答是圍繞了並發場景來描述的。
如果大家不明白並發場景,請先了解java並發
原子性,可以理解為CPU層面不能分割的操作,那麼 i++是原子操作嗎?不是的,實際它是i=i+1,這個操作首先要讀取i的值,然後為i值加1。是需要拆分的。非原子操作都會存在線程安全問題,需要我們使用同步技術(sychronized)來讓它變成一個原子操作。有好幾種方式實現一個原子操作。java提供了 sychronized代碼塊,lock介面(它的實現重入鎖是比較常用的)。還可以使用原子數據結構。AtomicInteger、AtomicLong、AtomicReference等。
可見性。可以理解為線程層面各個線程之間對某個操作是透明的,各個線程可以及時知道引用的改變。volatile修飾的變數可以保證可見性,假如,一個變數只有 1或者0兩種情況。那麼volatile修飾之後,就不需要對這個變數加同步操作了。強調一下。volatile不能保證原子性。volatile修飾的整數i,在多線程下 i++之後,不能得到預期的值
㈦ 為什麼java基本數據類型是原子的但是i 還存在線程安全問題
這個問題本身是錯誤的觀點,基本數據類型是數據結構,原子性是操作定義,不是一個概念。
原話是這樣的,基本數據類型的賦值是原子性操作。這里還要排除long和double,或者標明64bit操作系統。因為long和double類型是8位元組,而低位操作系統(32bit)單次內存的存儲結構最大隻能存儲4個位元組,所以每次操作都要分兩次進行,也就是非原子性操作。
那int類型的i++為什麼還有線程安全問題(推測了問題真正想表達的意思)?因為i++在指令中是賦值和自增兩個操作。賦值沒問題,但自增是要讀取和寫入兩個操作,很明顯是非原子性操作,自然就有安全問題。另外volatile只有兩個作用,一個是禁用指令重排,一個是強制讀取主存,沒有絕對的原子性。