網(wǎng)站橫幅js代碼如何策劃一個營銷方案
?synchronized 和 ReentrantLock的區(qū)別
synchronized 和 ReentrantLock 都是 Java 中提供的可重入鎖,二者的主要區(qū)別有以下 5 個:
- 用法不同:synchronized 可以用來修飾普通方法、靜態(tài)方法和代碼塊,而 ReentrantLock 只能用于代碼塊。ReentrantLock 在使用之前需要先創(chuàng)建 ReentrantLock 對象,然后使用 lock 方法進行加鎖,使用完之后再調(diào)用 unlock 方法釋放鎖
- 獲取鎖和釋放鎖的機制不同:synchronized 是自動加鎖和釋放鎖的,而 ReentrantLock 需要手動加鎖和釋放鎖。
- 鎖類型不同:synchronized 是非公平鎖,而 ReentrantLock 默認(rèn)為非公平鎖,也可以手動指定為公平鎖。
- 響應(yīng)中斷不同:ReentrantLock 可以響應(yīng)中斷,解決死鎖的問題,而 synchronized 不能響應(yīng)中斷。
- 底層實現(xiàn)不同:synchronized 是 JVM 層面通過監(jiān)視器實現(xiàn)的,而 ReentrantLock 是基于 AQS 實現(xiàn)的。
?ConcurrentHashMap的底層實現(xiàn)
為什么ConcurrentHashMap是線程安全的?
ConcurrentHashMap是線程安全的數(shù)組,是HashTable的替代品,同為線程安全,其性能要比HashTable更好?。
1、在 JDK 1.7 中它使用的是數(shù)組加鏈表的形式實現(xiàn)的,而數(shù)組又分為:大數(shù)組 Segment 和小數(shù)組 HashEntry。大數(shù)組 Segment 可以理解為 MySQL 中的數(shù)據(jù)庫,而每個數(shù)據(jù)庫(Segment)中又有很多張表 HashEntry,每個 HashEntry 中又有多條數(shù)據(jù),這些數(shù)據(jù)是用鏈表連接的。
- Segment 本身是基于 ReentrantLock 實現(xiàn)的加鎖和釋放鎖的操作,這樣就能保證多個線程同時訪問 ConcurrentHashMap 時,同一時間只有一個線程能操作相應(yīng)的節(jié)點,這樣就保證了 ConcurrentHashMap 的線程安全了。
2、在JDK 1.8 中 ConcurrentHashMap 使用的是數(shù)組+鏈表/紅黑樹的方式實現(xiàn)的,
- 它是通過 CAS 或 synchronized 來實現(xiàn)線程安全的,并且它的鎖粒度更小,查詢性能也更高。
多態(tài)的實現(xiàn)原理?和 實現(xiàn)方法
多態(tài)的實現(xiàn)原理主要是依靠“動態(tài)綁定”和“虛擬方法調(diào)用”,它的實現(xiàn)流程如下:
- 動態(tài)綁定(Dynamic Binding):指的是在編譯時,Java 編譯器只能知道變量的聲明類型,而無法確定其實際的對象類型。而在運行時,Java 虛擬機(JVM)會通過動態(tài)綁定來解析實際對象的類型。這意味著,編譯器會推遲方法的綁定(即方法的具體調(diào)用)到運行時。正是這種動態(tài)綁定機制,使得多態(tài)成為可能。
- ?虛擬方法調(diào)用是在運行時根據(jù)實際對象的類型來確定要調(diào)用的方法的機制。當(dāng)通過父類類型的引用變量調(diào)用被子類重寫的方法時,虛擬機會根據(jù)實際對象的類型來確定要調(diào)用的方法版本,而不是根據(jù)引用變量的聲明類型。
????????通過方法重寫和方法重載來實現(xiàn)
${} 和 #{} 有什么區(qū)別??
- ${} 和 #{} 都是 MyBatis 中用來替換參數(shù)的,它們都可以將用戶傳遞過來的參數(shù),替換到 MyBatis 最終生成的 SQL 中。
- 它們二者的區(qū)別主要體現(xiàn)在:
- 1、功能不同:
${}
?是直接替換,而 #{} 是預(yù)處理;- 2、使用場景不同:普通參數(shù)使用 #{},如果傳遞的是 SQL 命令或 SQL 關(guān)鍵字,需要使用?
${}
,但在使用前一定要做好安全驗證;- 3、安全性不同:使用?
${}
?存在安全問題,而 #{} 則不存在安全問題。
<select id="getUserById" resultType="com.example.demo.model.UserInfo">select * from userinfo where id=${id}
</select>
<select id="getUserById" resultType="com.example.demo.model.UserInfo">select * from userinfo where id=#{id}
</select>