java同步鎖
⑴ java中的同步鎖synchronized有哪幾種
有4種:
instance 方法同步、
instance 方法中部分程式碼同步、
static 方法同步、
class literals 同步。
⑵ java中哪種同步鎖比較好用
synchronized用法簡單,同步方法或者同步塊,但是比較重量級。
lock用起來稍麻煩,API層面的同步,競爭激烈性能比synchronized好很多。
Atomic性能比synchronized略遜,而激烈的時候,也能維持常態,但是只能同步一個值。
volatile輕量級強制讀取內存, 禁止指令重排,特定場合使用,不是萬能的同步,理解原理分析後才能使用。
⑶ java線程中的同步鎖和互斥鎖有什麼區別
互斥是通過競爭對資源的獨占使用,彼此之間不需要知道對方的存在,執行順序是一個亂序。
同步是協調多個相互關聯線程合作完成任務,彼此之間知道對方存在,執行順序往往是有序的。
⑷ java 程序中怎麼保證多線程的運行安全
2.1.讀一致性
Java 中針對上述「讀不安全」的問題提供了關鍵字 volatile 來解決問題,被 volatile 修飾的成員變數,在內容發生更改的時候,會通知所有線程去主內存更新最新的值,這樣就解決了讀不安全的問題,實現了讀一致性。
但是,讀一致性是無法解決寫一致性的,雖然能夠使得每個線程都能及時獲取到最新的值,但是1.1中的寫一致性問題還是會存在。
既然如此,Java 為啥還要提供 volatile 關鍵字呢?這並非多餘的存在,在某些場景下只需要讀一致性的話,這個關鍵字就能夠滿足需求而且性能相對還不錯,因為其他的能夠保證「讀寫」都一直的辦法,多多少少存在一些犧牲。
2.2.寫一致性
Java 提供了三種方式來保證讀寫一致性,分別是互斥鎖、自旋鎖、線程隔離。
2.2.1.互斥鎖
互斥鎖只是一個鎖概念,在其他場景也叫做獨占鎖、悲觀鎖等,其實就是一個意思。它是指線程之間是互斥的,某一個線程獲取了某個資源的鎖,那麼其他線程就只能睡眠等待。
在 Java 中互斥鎖的實現一般叫做同步線程鎖,關鍵字 synchronized,它鎖住的范圍是它修飾的作用域,鎖住的對象是:當前對象(對象鎖)或類的全部對象(類鎖)——鎖釋放前,其他線程必將阻塞,保證鎖住范圍內的操作是原子性的,而且讀取的數據不存在一致性問題。
對象鎖:當它修飾方法、代碼塊時,將會鎖住當前對象
類鎖:修飾類、靜態方法時,則是鎖住類的所有對象
注意:鎖住的永遠是對象,鎖住的范圍永遠是 synchronized 關鍵字後面的花括弧劃定的代碼域。
2.2.2.自旋鎖
自旋鎖也只是一個鎖概念,在其他場景也叫做樂觀鎖等。
自旋鎖本質上是不加鎖,而是通過對比舊數據來決定是否更新:
⑸ JAVA編程同步,加鎖如何實現,有何優缺點
同步鎖「synchronize」,手動鎖Lock
synchronize:自動鎖住,自動開鎖。(自動都是建立在一定的條件上的)
Lock:手動,手動鎖住,手動開鎖
具體如何實現,這里不好說,一時說不清,自行搜索。