中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

synchronized和ReentrantLock可重入鎖驗證的操作方法

發布時間:2021-09-23 09:08:35 來源:億速云 閱讀:122 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關synchronized和ReentrantLock可重入鎖驗證的操作方法,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

一個線程已經獲得了一把鎖,則可以再多次重復獲得這把已經獲取的鎖而不會發生死鎖(可類比生活大門鎖示例)。

前言

可重入鎖又名遞歸鎖,是指在同一個線程在外層方法獲取鎖的時候,再進入該線程的內層方法會自動獲取鎖(前提,鎖對象得是同一個對象),不會因為之前已經獲取過還沒釋放而阻塞。Java中ReentrantLock和synchronized都是可重入鎖,可重入鎖的一個優點是可一定程度避免死鎖。

一、synchronized可重入驗證

package com.lau.javabase.lock;

/**
 * 隱式鎖
 */
public class ReenterSynchronizedTest {

    public synchronized void print(){
        System.out.println("外層調用...");

        //中層調用
        print2();

        //內層調用
        print3();
    }

    public synchronized void print2(){
        System.out.println("中層調用...");
    }

    public synchronized void print3(){
        System.out.println("內層調用...");
    }

    public static void main(String[] args) {
        ReenterSynchronizedTest test = new ReenterSynchronizedTest();

//        test.print();

        test.print4();
    }

    /**
     * 同一個線程可以多次獲得同一把鎖
     */
    public void print4(){
        synchronized (this){
            System.out.println("外層調用呀...");
            synchronized (this){
                System.out.println("中層調用呀...");
                synchronized (this){
                    System.out.println("內層調用呀...");
                }
            }
        }
    }

}

輸出:

外層調用呀...
中層調用呀...
內層調用呀...

二、ReenTrantLock可重入性驗證

package com.lau.javabase.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 顯示鎖
 */
public class ReenterLockTest {

    public static void main(String[] args) {
        ReenterLockTest test = new ReenterLockTest();

        test.print();

        new Thread(() -> test.print2(),"t").start();
    }

    private Lock lock = new ReentrantLock();

    /**
     * 同一個線程可以多次獲得同一把鎖
     */
    public void print(){
        try{
            lock.lock();
            lock.lock();
            System.out.println("外層調用");

            try{
                lock.lock();
                System.out.println("中層調用");

                try{
                    lock.lock();
                    System.out.println("內層調用");
                }
                finally {
                    lock.unlock();
                }
            }
            finally {
                lock.unlock();
            }
        }
        finally {
            lock.unlock();
//            lock.unlock();
        }
    }

    public void print2(){
        try{
            lock.lock();
            System.out.println("come on!");
        }
        finally {
            lock.unlock();
        }
    }

}

輸出:

外層調用
中層調用
內層調用

看完上述內容,你們對synchronized和ReentrantLock可重入鎖驗證的操作方法有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

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

AI

濮阳市| 古丈县| 资讯| 沐川县| 陇西县| 荥经县| 延安市| 荆门市| 杭锦后旗| 龙陵县| 睢宁县| 彩票| 鲁山县| 温泉县| 郧西县| 景泰县| 越西县| 运城市| 临江市| 淮滨县| 拉萨市| 新河县| 二连浩特市| 瑞昌市| 莱州市| 东安县| 聊城市| 平阳县| 红桥区| 林芝县| 雷州市| 繁峙县| 水富县| 晋中市| 临桂县| 修水县| 高陵县| 招远市| 英吉沙县| 平湖市| 涪陵区|