激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - Java鎖之可重入鎖介紹

Java鎖之可重入鎖介紹

2019-12-04 12:44junjie JAVA教程

這篇文章主要介紹了Java鎖之可重入鎖介紹,可重入鎖,也叫做遞歸鎖,指的是同一線程外層函數獲得鎖之后,內層遞歸函數仍然有獲取該鎖的代碼,但不受影響,需要的朋友可以參考下

作為并發共享數據,保證一致性的工具,在JAVA平臺有多種實現(如 synchronized 和 ReentrantLock等等 ) 。這些已經寫好提供的鎖為我們開發提供了便利,但是鎖的具體性質以及類型卻很少被提及。本系列文章將分析JAVA下常見的鎖名稱以及特性,為大家答疑解惑。

四、可重入鎖:

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

可重入鎖,也叫做遞歸鎖,指的是同一線程 外層函數獲得鎖之后 ,內層遞歸函數仍然有獲取該鎖的代碼,但不受影響。
在JAVA環境下 ReentrantLock 和synchronized 都是 可重入鎖。

下面是使用實例:

 

復制代碼代碼如下:


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();
 }
}

 

兩個例子最后的結果都是正確的,即 同一個線程id被連續輸出兩次。

結果如下:

 

復制代碼代碼如下:

Threadid: 8
Threadid: 8
Threadid: 10
Threadid: 10
Threadid: 9
Threadid: 9

 

可重入鎖最大的作用是避免死鎖。
我們以自旋鎖作為例子。

 

復制代碼代碼如下:

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函數內,應驗證線程是否為已經獲得鎖的線程)
2、若1問題已經解決,當unlock()第一次調用時,就已經將鎖釋放了。實際上不應釋放鎖。
(采用計數次進行統計)

修改之后,如下:

 

復制代碼代碼如下:


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);
   }

  }

 }
}

 

該自旋鎖即為可重入鎖。

延伸 · 閱讀

精彩推薦
  • JAVA教程java開發命名規范總結

    java開發命名規范總結

    包名的書寫規范 (Package)推薦使用公司或機構的頂級域名為包名的前綴,目的是保證各公司/機構內所使用的包名的唯一性。包名全部為小寫字母,且具有...

    java開發網4092019-10-17
  • JAVA教程java之Object類用法實例

    java之Object類用法實例

    這篇文章主要介紹了java之Object類用法實例,是Java程序設計中比較重要的概念,以實例的形式對其定義及用法做了較為深入的講解,需要的朋友可以參考下 ...

    shichen20143972019-12-01
  • JAVA教程java使用淘寶API讀寫json實現手機歸屬地查詢功能代碼

    java使用淘寶API讀寫json實現手機歸屬地查詢功能代碼

    本文介紹java使用淘寶API讀寫json實現手機歸屬地查詢功能,代碼簡單,大家可以參考使用 ...

    java之家2512019-10-22
  • JAVA教程spring cloud consul使用ip注冊服務的方法示例

    spring cloud consul使用ip注冊服務的方法示例

    這篇文章主要介紹了spring cloud consul使用ip注冊服務的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要...

    流浪的神明4232019-06-19
  • JAVA教程從java面試題了解你所模糊的數組

    從java面試題了解你所模糊的數組

    這篇文章主要介紹了從java面試題了解你所模糊的數組,數組用來存儲一系列的數據項,其中的每一項具有相同的基本數據類型、類或相同的父類。通過使用...

    話爾loony1922019-06-27
  • JAVA教程通過代碼快速理解Java的三種代理模式

    通過代碼快速理解Java的三種代理模式

    這篇文章主要介紹了通過代碼快速理解Java的三種代理模式,代理(Proxy)是一種設計模式,提供了對目標對象另外的訪問方式,即通過代理對象訪問目標對象。...

    mseddl2842019-06-29
  • JAVA教程java常用工具類之DES和Base64加密解密類

    java常用工具類之DES和Base64加密解密類

    這篇文章主要介紹了java常用工具類之DES和Base64加密解密類,需要的朋友可以參考下 ...

    junjie2192019-11-24
  • JAVA教程Java中的5種同步輔助類介紹

    Java中的5種同步輔助類介紹

    你提交了一些任務,但你想等它們都完成了再做另外一些事情;你提交了一些任務,但是不想讓它們立刻執行,等你喊123開始的時候,它們才開始執行;等...

    Java教程網1802019-11-20
328
主站蜘蛛池模板: 九色com| 国产成人精品区一区二区不卡 | 欧美性生活xxxxx | 国产三级在线观看a | 国产 视频 一区二区 | 视频一区二区不卡 | 亚洲91精品 | 少妇一级淫片免费放正片 | 国产免费一级 | 亚洲国产精久久久久久久 | 黑人一区 | 欧美另类69xxxxx 视频 | 欧美一级免费在线观看 | 91短视频版高清在线观看www | 香蕉国产在线视频 | 久草在线观看首页 | 竹内纱里奈55在线观看 | 欧美成人毛片 | 国产精品爱久久久久久久 | 女人久久久www免费人成看片 | 久久99国产精品久久 | 久久小视频 | 国产欧美日韩在线不卡第一页 | 午夜久久电影 | 艹艹艹逼| 国产午夜精品久久久 | 国产正在播放 | 九九热这里只有精品8 | 99精品在线视频观看 | 天天操天天干天天操 | 日韩精品久久久久久久电影99爱 | 特级黄毛片 | 色啪综合| 成人午夜视频在线观看免费 | 国产一级毛片国语版 | 亚洲骚图 | 国产高潮好爽好大受不了了 | 亚洲精品午夜国产va久久成人 | 逼片 | 午夜精品在线视频 | 久久久久久久久亚洲精品 |