91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java 并發編程實戰重入鎖(子類同步方法調用父類的同步方法)

發布時間:2020-05-26 14:35:36 來源:網絡 閱讀:1051 作者:wx5c78c8b1dbb1b 欄目:編程語言
看如下代碼
public class Widget {

    public synchronized void doSomething () {
        System.out.println(this.toString()+"---------------------");
    }
}
public class LoggingWidget extends Widget {

    public synchronized void doSomething () {
        System.out.println(this.toString()+ ": calling doSomething");
        super.doSomething();
    }

    public static void main (String[] args) throws InterruptedException {
        for (int i = 0; i < 2; i++) {
            Thread thread = new Thread(() -> {
                Widget widget = new LoggingWidget();
                widget.doSomething();
            });
            thread.start();
        }
    }
}
  • 書上說如果內置鎖不是可重入的,那么這段代碼將發生死鎖.我們先來理解一下什么是重入鎖,當某個線程請求一個由某個線程持有的鎖時,發出的請求就會阻塞.然而,由于內置鎖時可重入的,因此如果某個線程試圖獲得一個已經由它自己持有的鎖,那么這個請求就會成功.
  • 理解了重入鎖,我們來看下幾種synchronized的鎖對象,同步方法的鎖對象:this,靜態的鎖對象:當前類的class對象,同步代碼塊的鎖對象:任意對象.
  • 接下來我們來分析下代碼的執行,假設線程A初始化了LoggingWidget 對象,接著去執行doSomething 方法,由于doSomething 方法是非靜態同步方法,所以鎖對象就是this對象本身,獲取對象鎖,然后打印this.toString,接著調用super.doSomething 方法,由于是同步方法所以也需要獲取鎖對象,由于線程A已經獲取了對象鎖,所以super.doSomething方法如果和doSomething 方法是同一個鎖對象就可以執行,如果不是就獲取不到鎖,就會產生死鎖,永遠獲取不到.筆者在這里不理解的問題是super.doSomething()是誰調用的,如果父類,那么這個同步方法的鎖對象就是父類本身,那么線程A不可能同時獲取兩個鎖對象.如果是子類調用的線程A已經獲取了鎖對象,所以就可以執行.
  • 我們來看下運行結果:
    com.concyrrency.test.lock.LoggingWidget@2cb7a5c1: calling doSomething
    com.concyrrency.test.lock.LoggingWidget@2cb7a5c1---------------------
    com.concyrrency.test.lock.LoggingWidget@77df833b: calling doSomething
    com.concyrrency.test.lock.LoggingWidget@77df833b---------------------
  • 可以看到兩個線程的分別打印的this.toString都是一樣的,說明super.doSomething()的調用者是子類,而且內置鎖是可以重入的.
  • 理解super關鍵字,在Java類中使用supper來引用分類的成分,用this來引用當前的對象,如果一個類從另一個類繼承,new這個子類實例對象的時候,這個子類對象會含有一個父類對象,怎么去引用父類的對象了,使用super來停用,this指的是當前對象的引用,super是當前對象里面父類的引用.

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

三门县| 于田县| 肃南| 公主岭市| 略阳县| 神农架林区| 黄骅市| 斗六市| 宾川县| 乌鲁木齐县| 永丰县| 略阳县| 绥江县| 台北县| 锦州市| 资溪县| 厦门市| 淮滨县| 赤壁市| 万盛区| 梓潼县| 尉氏县| 龙游县| 怀来县| 元朗区| 万载县| 苏尼特左旗| 岱山县| 永平县| 鱼台县| 公安县| 元氏县| 保康县| 昭通市| 河津市| 邛崃市| 博客| 通城县| 五家渠市| 武城县| 汕尾市|