談談你對AtomicInteger的理解(不看後悔,看了必懂)
AtomicInteger是一個提供原子操作的Integer類,通過執行緒安全的方式操作加減。十分適合高併發情況下的使用
對於全域性變數的數值型別操作 num++,若沒有加synchronized關鍵字則是執行緒不安全的,num++解析為num=num+1,明顯,這個操作不具備原子性,多執行緒時必然會出現問題。測試下:
輸出的結果為count: 9992,這個值不定,每次測試都可能不一樣,很顯然,100個執行緒跑++操作,結果並沒有像預期的那樣count: 10000。
要是換成volatile修飾count變數呢?
volatile count: 9984,果然還是出現問題了,volatile僅僅保證變數線上程間保持可見性,卻依然不能保證非原子性的操作。
用了AtomicInteger類後會變成什麼樣子呢?
結果每次都輸出"AtomicInteger count: 10000",沒毛病。concurrent(我這裡是jdk1.7)包下提供了12種原子操作型別,如下:
concurrent包下除了提供的原子更新基本型別,還有原子更新資料、原子更新引用型別、原子更新欄位類,最常用的也就是原子更新基本型別了
相關推薦
談談你對AtomicInteger的理解(不看後悔,看了必懂)
AtomicInteger是一個提供原子操作的Integer類,通過執行緒安全的方式操作加減。十分適合高併發情況下的使用 對於全域性變數的數值型別操作 num++,若沒有加synchronized關鍵字則是執行緒不安全的,num++解析為num=num+1,明顯,這個操作不
談談對Spring中IOC以及DI的理解(針對新手小白一讀即懂)
Spring中IOC以及DI的理解學習過Spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴注入)這兩個概念,對於初學Spring的人來說,總覺得IoC 、DI這兩個概念是模糊不清的,是很難理解的,今天和大家分享網上的一些技術大牛們對Spring框架
重量級鎖 synchronized(不看後悔,看了必懂)
synchronized關鍵字並非一開始就該物件加上重量級鎖,也是從偏向鎖,輕量級鎖,再到重量級鎖的過程。這個過程也告訴我們,假如我們一開始就知道某個同步程式碼塊的競爭很激烈、很慢的話,那麼我們一開始就應該使用重量級鎖了,從而省掉一些鎖轉換的開銷。 互斥鎖(重量級鎖)也稱為阻塞同步、悲觀鎖
自旋鎖和自適應自旋鎖(不看後悔,看了必懂)
自旋鎖 所謂自旋,就是指當有另外一個執行緒來競爭鎖時,這個執行緒會在原地迴圈等待,而不是把該執行緒給阻塞,直到那個獲得鎖的執行緒釋放鎖之後,這個執行緒就可以馬上獲得鎖的。鎖在原地迴圈的時候,是會消耗cpu的,就相當於在執行一個啥也沒有的for迴圈。 本來一個執行緒把鎖釋放之後,當前執行緒
輕量級鎖(不看後悔,看了必懂)
輕量級鎖是由偏向鎖升級來的,偏向鎖執行在一個執行緒進入同步塊的情況下,當第二個執行緒加入鎖爭用的時候,偏向鎖就會升級為輕量級鎖(又叫做鎖膨脹); 輕量級鎖也被稱為非阻塞同步、樂觀鎖,因為這個過程並沒有把執行緒阻塞掛起,而是讓執行緒空迴圈等待,序列執行。 輕量級鎖適用於那些同步
偏向鎖(不看後悔,看了必懂)
它會偏向第一個訪問鎖的執行緒,如果在執行過程中,同步鎖只有一個執行緒訪問,不存在多執行緒爭用的情況,則執行緒是不需要觸發同步的,這種情況下,就會給執行緒加一個偏向鎖。 如果在執行過程中,遇到了其他執行緒搶佔鎖,則持有偏向鎖的執行緒會被掛起,JVM會消除它身上的偏向鎖,將鎖恢復到標準的輕
樂觀鎖和悲觀鎖(不看後悔,看了必懂)
鎖從巨集觀上分類,分為樂觀鎖和悲觀鎖 樂觀鎖是一種樂觀的思想,每次獲取資料的時候都不擔心資料會被修改,所以每次獲取資料的時候都不會加鎖,但是在更新的時候需要判斷該資料是否被人修改過.如果資料被其他執行緒修改,則不進行資料更新,否則,更新.由於資料沒有加鎖,期間該資料可以被其他執行緒進行讀寫操
hibernate和mybatis的區別(不看後悔,看了必懂)
①hibernate是一個標準的orm(物件關係對映)框架,通過JavaBean和資料庫的對映結構來自動生成sql;mybatis是不完全的orm框架,專注於sql本身,需要程式設計師自己寫sql; ②hibernate對sql的優化和修改比較困難,適合於需求變化不多的中小型專案,如ERP(
如何執行緒安全地實現一個計數器(不看後悔,看了必懂)
i++是執行緒安全的嗎 i++和++i的執行緒安全分為兩種情況: 1、如果i是區域性變數(在方法裡定義的),那麼是執行緒安全的。因為區域性變數是執行緒私有的,別的執行緒訪問不到,其實也可以說沒有執行緒安不安全之說,因為別的執行緒對他造不成影響。 2、如果i是全域性變
ReentrantLock可重入鎖(不看後悔,看了必懂)
ReentraantLock是通過一個FIFO的等待佇列來管理獲取該鎖所有執行緒的。在“公平鎖”的機制下,執行緒依次排隊獲取鎖(先等待的執行緒先獲得鎖);而“非公平鎖”在鎖是可獲取狀態時,不管自己是不是在佇列的開頭都會獲取鎖。 ReentrantLock和synchroni
synchronized和Lock有什麼區別(不看後悔,看了必懂)
java語言中提供了兩種鎖機制來實現對某個共享資源的同步:synchronized和Lock.其中synchronized使用Object物件本身的notify,wait和notifyAll來實現執行緒之間的排程.而Lock可以使用Condition程序執行緒之間的排程 ①用法不同 sy
終止執行緒的方法(不看後悔,看了必懂)
在java語言中,可以使用stop()方法和suspend()方法來終止執行緒的執行. 當使用Thread.stop()來終止執行緒時,它會釋放已經鎖定的所有監視資源,具有不安全性 suspend()方法不會釋放鎖,容易發生死鎖(兩個或者兩個以上程序在執行過程中,因爭奪資源而造成程序間互
sleep和wait方法的區別(不看後悔,看了必懂)
①原理不同 sleep()方法是Thread類的靜態方法,它會使執行緒的執行暫停一段時間,把執行機會讓給其他執行緒,等倒計時時間一到,此執行緒會自動甦醒 wait()是Object類的方法,用於執行緒間的通訊,使當前擁有鎖的程序等待,直到其他執行緒呼叫notify()方法才醒過來 ②
MySQL 中的行級鎖、表級鎖和頁級鎖(不看後悔,看了必懂)
行級鎖 行級鎖是 MySQL 中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。行級鎖分為共享鎖和排他鎖。 特點:加鎖開銷大,會出現死鎖,鎖定粒度最小,發生鎖衝突的概率最低,併發度最高 頁級鎖 頁級鎖是 MySQL 中鎖定粒度介於行級鎖和表級鎖中間的一種鎖。
併發(Concurrent)和並行(Parallel)和區別(不看後悔,看了必懂)
併發 單個處理器(CPU),輪換執行多個任務,因為輪換的速度比較快,看起來好像多個任務在同時執行一樣 並行 多個處理器(CPU),同時執行多個任務,每個任務分配在一個處理器上執行 併發就像是一個
程序的狀態(不看後悔,看了必懂)
就緒態:程序已經準備好,只要分配到CPU就可以執行 執行態:程序處於就緒態被排程後,進出進入執行狀態 阻塞狀態:正在執行的程序由於某些事件(I/O請求,申請緩衝區失敗)而暫時無法執行,程序進入阻
idea——建立ssm框架專案(不使用maven,自己匯入jar包)
在idea建立ssm專案 1.建立ssm專案在idea中: 2.設定: 其餘的和普通的javaweb專案差不多,如果不懂,請看: https://blog.csdn.net/weixin_43075298/article/details/85678844 注意: 1.
jena 簡單查詢(不帶推理,直接讀取owl檔案)
//用的是protege 裡面的people demo import com.hp.hpl.jena.rdf.model.*; import com.hp.hpl.jena.ontology.*; import com.hp.hpl.jena.query.Que
談談你對CountDownLatch的理解(不看後悔,一看必懂)
CountDownLatch是java.util.concurrent包中一個工具類。它能夠使一個或者多個執行緒等待另外一些執行緒完成各自的工作之後,再繼續執行 使用CountDownLatch的一些情景: ①需要去解析一個Excel的資料,為了更快的解析,每個sheet都使用一個執行緒
面試題(一)- 談談你對資料庫中索引的理解
轉載自《http://www.cnblogs.com/newpanderking/p/3781043.html》 1、首先要明白無名無實莫要用索引:因為資料中的記錄很多,為了方便我們查詢,提高查詢的效率; 2、索引的原理:對要查詢的欄位建立索引其實就是把該欄位按照一定的