併發基礎之一 多執行緒synchronized

2021-09-27 07:55:35 字數 2366 閱讀 1698

public class demo	}	

//簡便的寫法一、

public void test() }

//簡便的寫法二、

public synchronized void test()

//在這裡的排序也是有講究的,synchronized雖然在

一、二這裡起到的作用相同。

//但是synchronied如果只需要一部分**需要上鎖,那麼就不要鎖整個**塊,鎖一小部分**塊就行了

//這樣的好處在於寫法一與寫法二的效能上,一的效能會好與二的效能,cpu徵用的時間減少了,提高了效率。

}

synchronized就是所說的鎖,但是要清楚的是,它不是鎖方法,不是**塊,而是分兩種情況,一種是物件類的例項,一種是類的位元組碼。

比如:當同時有兩個執行緒執行這個方法的時候,當第乙個正在使用還未結束時,第二個執行緒就無法繼續使用。一定程度上保證了執行緒的穩定和安全,但是這並不代表使用synchronized就代表著執行緒安全。

public class demo

}}

答案是:不能!靜態(static)方法不能使用this,因為靜態方法可以直接通過呼叫class.method(類名.方法名)來使用,那麼就沒有這個例項了,沒有就鎖不到東西了。所以只能通過demo.class來鎖了

答案:可以同時呼叫,因為它們並非同乙個方法自然可以同時呼叫了。
2.同步方法呼叫同步方法能否得到鎖?

答案:可以。

1.因為它們是用乙個鎖的,當乙個方法裡面,還有乙個方法也需要這個鎖的時候,那麼這個方法也是可以得到鎖的。

2.這證明synchronized支援 重入鎖 的

3.順便一提,繼承關係下的鎖也是共享的,也是可以重入鎖的。

關於髒讀問題:

- 主要表現在讀與寫方面。例如:乙個銀行為例子,使用者存錢為寫,顯示餘額為讀。

- 為了保證使用者能夠成功存錢,一般都會在寫上加上synchronized來保證成功率。

- 但是顯示餘額上,它卻沒辦法馬上讀取到剛剛存進去的那部分錢。

- 所以也需要在讀的方法上面也加上synchronized來保證資料的讀取。

volatile:

- 是synchronized的乙個輕量級關鍵字,它不能保證量子性,卻能保證可見性。

- 倘若你在變數的修飾中加了volatile,它的可見性,會通知jmm裡所有的程序,這個變數的值變化了。

- 其實不加的話也可以,以現在的科技,可以完全不用加。

- 因為現在的cpu都很高階,效能也很好,現在的cpu有乙個快取協議,它能夠保證每個cpu的快取都能及時重新整理過來。

- 缺點:volatile只保證可見性,卻沒辦法保證原子性,它不會管你讀取前是什麼,只會管顯示。倘若10個執行緒同時i++一百次,按常理i會是1000,但是只有volatile的話,只會少於1000。

- 解決方法:在i++一百次的方法上加synchronized來修飾,倘若不想用synchronized的話,可以用atomic的類來解決。整型用atomicinteger.incrementandget()來解決足以。

- 但是即便如此,多個atomic類連續呼叫也不能構成原子性。

死鎖:

public class demo

} public void test2()

} public static void main(string args)

}

死鎖是多執行緒中乙個詭異的現象,明明用來當鎖的物件並不一樣,按照道理來說應該是互不阻塞的。但是執行的時候卻會發生阻塞的現象。原因就在於s1和s2是常量。s1和s2是常量,並且都是「hello」,所以它們在常量池裡的位址其實是一樣的,所以我們要避免使用常量作為鎖。這也是為什麼一般都是用物件來當鎖的原因。

- 死鎖原因

- 當test1執行的時候,由於位址一樣。

- 原本只用s1的test1在過程中會用到s2,用s2為鎖test2也會在過程中運用到s1,

- 造成了各方都在等待另一方釋放鑰匙。最後的結果就是發生了阻塞。

wait():等待執行緒。

notify():喚醒執行緒,能夠喚醒wait()等待執行緒。

但是要注意的是:

- wait()和notify()必須在同乙個方法裡面。

- wait()等待會釋放鎖,但是notify()不會。

- 所以即便notify()喚醒了wait()所在的執行緒,wait()所在的執行緒也沒辦法馬上執行。

- 因為它的鎖正在nofity()那裡,需要等它結束後才能用。

併發程式設計筆記(一) 多執行緒

一 我們為什麼要使用多執行緒 首先要了解一點,我們跑程式最耗時的是io讀寫,所以會出現來了很多請求,卻要等待第乙個請求io結束才能繼續接受下乙個請求,非常影響效率 另外,單執行緒的請求處理是線性的,前端發起請求需要等待後台所有的都處理結束前端才有響應,非常影響體驗。針對這兩點,多執行緒的優勢在於 1...

一 多執行緒 硬體基礎

目錄1.2快取一致性協議 1.3寫緩衝佇列與無效化佇列 處理器的處理能力要遠遠高於主記憶體dram的讀寫能力。進行一次主記憶體的讀寫所需要的時間,處理器可能足夠處理上百條指令。為了彌補處理器與主記憶體巨大的效率差距,處理器的設計者們引入了快取記憶體cache。快取記憶體的容量遠小於主記憶體,但是讀取...

多執行緒併發程式設計系列(一)多執行緒與鎖的使用

示例程式如下 include include include define thread count 10 void thread callback void arg int main int count 0 for int i 0 i thread count i for int i 0 i 10...