最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單了解Java中的可重入鎖

 更新時間:2019年11月27日 09:45:55   作者:syrdbt  
這篇文章主要介紹了簡單了解Java中的可重入鎖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了簡單了解Java中的可重入鎖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

本文里面講的是廣義上的可重入鎖,而不是單指JAVA下的ReentrantLock。

可重入鎖,也叫做遞歸鎖,指的是同一線程 外層函數(shù)獲得鎖之后 ,內層遞歸函數(shù)仍然有獲取該鎖的代碼,但不受影響。

在JAVA環(huán)境下 ReentrantLock 和synchronized 都是 可重入鎖。

下面是使用實例:

package reentrantLock;
 
public class Test implements Runnable{
 
  public synchronized void get(){
    System.out.println(Thread.currentThread().getId());
    set();
  }
 
  public synchronized void set(){
    System.out.println(Thread.currentThread().getId());
  }
 
  @Override
  public void run() {
    get();
  }
  public static void main(String[] args) {
    Test ss=new Test();
    new Thread(ss).start();
    new Thread(ss).start();
    new Thread(ss).start();
  }
}

運行截圖:

package reentrantLock;
 
import java.util.concurrent.locks.ReentrantLock;
 
public class Test implements Runnable {
  ReentrantLock lock = new ReentrantLock();
 
  public void get() {
    lock.lock();
    System.out.println(Thread.currentThread().getId());
    set();
    lock.unlock();
  }
 
  public void set() {
    lock.lock();
    System.out.println(Thread.currentThread().getId());
    lock.unlock();
  }
 
  @Override
  public void run() {
    get();
  }
 
  public static void main(String[] args) {
    Test ss = new Test();
    new Thread(ss).start();
    new Thread(ss).start();
    new Thread(ss).start();
  }
}

可重入鎖最大的作用是避免死鎖

我們以自旋鎖作為例子,

public class SpinLock {
	private AtomicReference<Thread> owner =new AtomicReference<>();
	public void lock(){
		Thread current = Thread.currentThread();
		while(!owner.compareAndSet(null, current)){
		}
	}
	public void unlock (){
		Thread current = Thread.currentThread();
		owner.compareAndSet(current, null);
	}
}

對于自旋鎖來說,

1、若有同一線程兩調用lock() ,會導致第二次調用lock位置進行自旋,產生了死鎖說明這個鎖并不是可重入的。(在lock函數(shù)內,應驗證線程是否為已經獲得鎖的線程)

2、若1問題已經解決,當unlock()第一次調用時,就已經將鎖釋放了。實際上不應釋放鎖。(采用計數(shù)次進行統(tǒng)計)修改之后,如下:

public class SpinLock1 {
	private AtomicReference<Thread> owner =new AtomicReference<>();
	private int count =0;
	public void lock(){
		Thread current = Thread.currentThread();
		if(current==owner.get()) {
			count++;
			return ;
		}
 
		while(!owner.compareAndSet(null, current)){
 
		}
	}
	public void unlock (){
		Thread current = Thread.currentThread();
		if(current==owner.get()){
			if(count!=0){
				count--;
			}else{
				owner.compareAndSet(current, null);
			}
 
		}
 
	}
}

該自旋鎖即為可重入鎖。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Spring Cloud Nacos 和 Eureka區(qū)別解析

    Spring Cloud Nacos 和 Eureka區(qū)別解析

    Spring Cloud Nacos 和 Spring Cloud Eureka 都是 Spring Cloud 微服務框架中的服務注冊和發(fā)現(xiàn)組件,用于幫助開發(fā)者輕松地構建和管理微服務應用,這篇文章主要介紹了Spring Cloud Nacos 和 Eureka區(qū)別,需要的朋友可以參考下
    2023-08-08
  • Spring Boot接收單個String入參的解決方法

    Spring Boot接收單個String入參的解決方法

    這篇文章主要給大家介紹了關于Spring Boot接收單個String入參的解決方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • Java實現(xiàn)寵物商店管理系統(tǒng)

    Java實現(xiàn)寵物商店管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)寵物商店管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • SpringBoot之HttpWebServiceMessageSenderBuilder用法詳解

    SpringBoot之HttpWebServiceMessageSenderBuilder用法詳解

    這篇文章主要介紹了SpringBoot之HttpWebServiceMessageSenderBuilder用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 面試官:怎么做JDK8的垃圾收集器的調優(yōu)(面試常問)

    面試官:怎么做JDK8的垃圾收集器的調優(yōu)(面試常問)

    這篇文章主要介紹了面試官:怎么做JDK8的垃圾收集器的調優(yōu),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot任務調度器的實現(xiàn)代碼

    SpringBoot任務調度器的實現(xiàn)代碼

    SpringBoot自帶了任務調度器,通過注解的方式使用。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • java環(huán)境變量配置和adb的配置教程詳解

    java環(huán)境變量配置和adb的配置教程詳解

    這篇文章主要介紹了java環(huán)境變量配置和adb的配置教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Java 添加、替換、刪除PDF中的圖片的示例代碼

    Java 添加、替換、刪除PDF中的圖片的示例代碼

    這篇文章主要介紹了Java 添加、替換、刪除PDF中的圖片,本文通過示例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Java 根據url下載網絡資源

    Java 根據url下載網絡資源

    這篇文章主要介紹了Java 根據url下載網絡資源的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • idea編譯時不提示任何錯誤信息的問題及解決

    idea編譯時不提示任何錯誤信息的問題及解決

    這篇文章主要介紹了idea編譯時不提示任何錯誤信息的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論

夏津县| 安岳县| 周至县| 仙桃市| 宁阳县| 寿宁县| 昌宁县| 云南省| 绥滨县| 洛南县| 屏山县| 新郑市| 台江县| 天全县| 新绛县| 清丰县| 喀喇沁旗| 凉山| 政和县| 东方市| 新余市| 合作市| 靖西县| 禹州市| 临湘市| 山东省| 陇川县| 白银市| 星子县| 金阳县| 台东市| 津南区| 鸡东县| 明水县| 寻甸| 卢湾区| 祁门县| 集安市| 佳木斯市| 富裕县| 和政县|