i++ 是執行緒安全的嗎?
i++不是原子操作,也就是說,它不是單獨一條指令,而是3條指令(3條彙編指令):
1、從記憶體中把i的值取出來放到CPU的暫存器中
2、CPU暫存器的值+1
3、把CPU暫存器的值寫回記憶體
由於執行緒共享棧區,不共享堆區和全域性區,所以當且僅當 i 位於棧上是安全的,反之不安全(++i也同理). 因為如果是全域性變數的話,同一程序中的不同執行緒都有可能訪問到。對於讀值,+1,寫值這三步操作,在這三步任何之間都可能會有CPU排程產生,造成i的值被修改,造成髒讀髒寫。
volatile不能解決這個執行緒安全問題。因為volatile只能保證可見性,不能保證原子性。
相關推薦
使用AtomicInteger原子類代替i++執行緒安全操作
Java中自增自減操作不具原子性,在多執行緒環境下是執行緒不安全的,可以使用使用AtomicInteger原子類代替i++,i--操作完成多執行緒執行緒安全操作。 下面是等於i++多執行緒的自增操作程式碼: public class AtomicIntegerTest { private s
區域性變數一定執行緒安全嗎
區域性變數, 如果是基本型別或是包裝型別, 依然不能通過多執行緒改變其值, 如果是物件, 則其屬性值是執行緒不安全的 demo1: public void compute(LocalDate date){ //在切換租戶時,只有當前執行緒的第一個租戶id
面試題,Servlet 執行緒安全嗎?
Servlet的工作原理:首先客戶傳送一個請求,Servlet是呼叫service()方法對請求進行響應的,通過原始碼可見,service()方法中對請求的方式進行了匹配,選擇呼叫doGet,doPost等這些方法,然後再進入對應的方法中呼叫邏輯層的方法,實現對客戶的響應。在
Vector 真的執行緒安全嗎?
Vector裡一些寫刪操作的方法都是用synchronized實現同步,這樣vecotor在使用時真的不需要考慮執行緒安全問題嗎? 答案是否! 下面看一個例子: Vector vector = new Vector(); public void put(String e
ConcurrentHashMap執行緒安全嗎?
# 前言 沒啥深入實踐的理論系同學,在使用併發工具時,總是認為把`HashMap`改為`ConcurrentHashMap`,就完美解決併發了呀。或者使用寫時複製的`CopyOnWriteArrayList`,效能更佳呀!技術言論雖然自由,但面對魔鬼面試官時,我們更在乎的是這些真的正確嗎?[整理了100+個J
i++ 是執行緒安全的嗎?
i++不是原子操作,也就是說,它不是單獨一條指令,而是3條指令(3條彙編指令): 1、從記憶體中把i的值取出來放到CPU的暫存器中 2、CPU暫存器的值+1 3、把CPU暫存器的值寫回記憶體 由於執行緒共享棧區,不共享堆區和全域性區,所以當且僅當 i 位於棧上是安全的
一道非常棘手的 Java 面試題:i++ 是執行緒安全的嗎
i++ 是執行緒安全的嗎? 相信很多中高階的 Java 面試者都遇到過這個問題,很多對這個不是很清楚的肯定是一臉蒙逼。內心肯定還在質疑,i++ 居然還有執行緒安全問題?只能說自己瞭解的不夠多,自己的水平有限。 先來看下面的示例來驗證下 i++ 到底是不是執行緒安全的。
Java面試題:Servlet是執行緒安全的嗎?
轉自: http://www.cnblogs.com/chanshuyi/p/5052426.html Servlet不是執行緒安全的。 要解釋為什麼Servlet為什麼不是執行緒安全的,需要了解Servlet容器(即Tomcat)使如何響應HTTP請求的。
Hibernate中SessionFactory是執行緒安全的嗎?Session是執行緒安全的嗎(兩個執行緒能夠共享同一個Session嗎)?
Hibernate中SessionFactory是執行緒安全的嗎?Session是執行緒安全的嗎(兩個執行緒能夠共享同一個Session嗎)? SessionFactory對應Hibernate的一個數據儲存的概念,它是執行緒安全的,可以被多個執行緒併發訪問。 Sessio
你的單例模式真的是執行緒安全的嗎?
在我們平時的專案中,單例模式是十分常見的設計模式,當然我們使用最多的是"懶漢式": public class SingleTon { private static SingleTon instance = null; private SingleTon(
i++和++i的區別,及其執行緒安全問題
i++和++i都是i=i+1的意思,但是過程有些許區別:i++:先賦值再自加。(例如:i=1;a=1+i++;結果為a=1+1=2,語句執行完後i再進行自加為2)++i:先自加再賦值。(例如:i=1;a=1+++i;結果為a=1+(1+1)=3,i先自加為2再進行運算)但是在
從volatile說到,i++原子操作,執行緒安全問題
1、可見性(Visibility) 可見性是指,當一個執行緒修改了某一個全域性共享變數的數值,其他執行緒是否能夠知道這個修改。 顯然,在序列程式來說可見性的問題是不存在的。因為你在任何一個地方操作修改了某個變數,那麼在後續的程式裡面,讀取這個變數的
從volatile說到i++的執行緒安全問題
簡介volatile關鍵字保證了在多執行緒環境下,被修飾的變數在別修改後會馬上同步到主存,這樣該執行緒對這個變數的修改就是對所有其他執行緒可見的,其他執行緒能夠馬上讀到這個修改後值.Thread的本地記憶體每個Thread都擁有自己的執行緒儲存空間Thread何時同步本地儲存
servlet是執行緒安全的嗎(不看後悔,一看必懂)
Servlet 預設是單例模式,在web 容器中只建立一個例項,所以多個執行緒同時訪問servlet的時候,Servlet是執行緒不安全的。 那麼 web 容器能為每個請求建立一個Servlet的例項(增加了系統的消耗)嗎?當然是可以的,只要Servlet實現SingleT
什麼是執行緒安全,你真的瞭解嗎
記得今年3月份剛來杭州面試的時候,有一家公司的技術總監問了我這樣一個問題,說你給我說說有哪些執行緒安全的類,我心裡一想,呵呵,這我早都背好了,稀里嘩啦說了一大堆,那你再來說說什麼是執行緒安全,然後就GG了,說真的,我們整天說執行緒安全,但是你對什麼是執行緒安全真的瞭解嘛?
10042---Java面試題:Servlet是執行緒安全的嗎?
servlet不是執行緒安全的。 要解釋為什麼Servlet為什麼不是執行緒安全的,需要了解Servlet容器(即Tomcat)使如何響應HTTP請求的。 當Tomcat接收到Client的HTTP請求時,Tomcat從執行緒池中取出一個執行緒,之後找到該請求對應的Serv
Servlet是執行緒安全的嗎?
今天面試問了這個,我當場猜!!! 沒去了解這個!!!!,丟人了 總結下!,忘了servlet只能初始化一次!!! Servlet 有例項物件 屬性,靜態變數就是執行緒不安全的!!, 反正安全! 要解釋為什麼Servlet為什麼不是執行緒安全的,需要了解Servlet容
Android SQLite是執行緒安全的嗎?
我們操作資料庫一般使用ContentProvider,SQLiteOpenHelper,應用中使用SQLiteDatabase db = SQLiteOpenHelper.getReadableDatabase(),這個db需要呼叫db.close()或者openH
springMVC注入是執行緒安全的嗎
springmvc的注入執行緒安全嗎 servlet是單例的,而tomcat則是在多個執行緒中呼叫servlet的處理方法。因此如果servlet存在例項物件,那麼就會引出執行緒安全的問題。而springmvc允許在controller類中通過@Autow
Hashmap是執行緒安全的嗎?為什麼?有哪些執行緒安全的容器?hashmap與hashmap的區別?
Hashmap是執行緒安全的嗎?為什麼? 不是,多執行緒呼叫的情況下擴容會出問題。 有哪些執行