什么是線程安全
當多個線程在訪問某一個類(對象或方法)時,這個類都能表現(xiàn)出正確的行為,那么這個類就是線程安全的。
什么是對象鎖和類鎖
當對象的方法使用synchronized修飾的時候,是對象鎖,不同的對象可以同時調用此方法
當類的synchronized方法使用static是類鎖,同一時間只能被一個線程調用。
多線程的臟讀是如何產(chǎn)生的
當一個對象的set方法未執(zhí)行完成時,對象的get方法執(zhí)行,讀到錯誤的數(shù)據(jù)。解決方法是對get的set方法都加上synchronied修飾
synchronized擁有鎖重入的功能如何理解
當一個線程得到對象的鎖之后,再次請求此對象可以再次得到鎖。
如對象有兩個同步方法A,B,A調B也是可以的。
如果父類和子類的方法都實現(xiàn)了同步,子類也可以調用父類的方法。
notify和wait有何不同
notify用于喚醒線程,不釋放鎖
wait使線程進入阻塞狀態(tài),釋放鎖
如何實現(xiàn)實時的通知
CountDownLatch
AtomicInteger
AtomicInteger,一個提供原子操作的Integer的類。在Java語言中,++i和i++操作并不是線程安全的,在使用的時候,不可避免的會用到synchronized關鍵字。而AtomicInteger則通過一種線程安全的加減操作接口。
ThreadLocal
BlockingQueue 都有哪些方法
| header 1 | header 2 | 3 |
|---|---|---|
| add | 增加一個元索 | 如果隊列已滿,則拋出一個IIIegaISlabEepeplian異常 |
| remove | 移除并返回隊列頭部的元素 | 如果隊列為空,則拋出一個NoSuchElementException異常 |
| element | 返回隊列頭部的元素 | 如果隊列為空,則拋出一個NoSuchElementException異常 |
| offer | 添加一個元素并返回true | 如果隊列已滿,則返回false |
| poll | 移除并返問隊列頭部的元素 | 如果隊列為空,則返回null |
| peek | 返回隊列頭部的元素 | 如果隊列為空,則返回null |
| put | 添加一個元素 | 如果隊列滿,則阻塞 |
| take | 移除并返回隊列頭部的元素 | 如果隊列為空,則阻塞 |
remove、element、offer 、poll、peek 其實是屬于Queue接口。