一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

  }

 }
}

 

該自旋鎖即為可重入鎖。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 学校女性奴sm训练调教 | 日本漫画工囗全彩番在线 | 武侠古典久久亚洲精品 | 沉沦艳妇杨幂肉体小说 | 91短视频版高清在线观看免费 | 污黄漫 | 爱福利一区二区 | 9191免费永久观看 | sss视频在线精品 | 国产精品女主播自在线拍 | 美女撒尿毛片免费看 | 成人在线免费播放 | 高h全肉动漫在线观看免费 高h辣h双处全是肉军婚 | 欧美黑人一级片 | 黑人巨大videosjapan高清 黑人好大 | 婷婷精品进入 | 亚洲福利在线观看 | 日韩精品视频美在线精品视频 | 特级毛片免费观看视频 | 日本老熟老太hd | 国产免费一区二区三区 | 不良研究所地址一 | 天天综合天天色 | 果冻传媒九一制片厂 | 欧美亚洲一区二区三区在线 | 精品国产欧美一区二区五十路 | 国产日韩精品一区二区 | 19+韩国女主播激情vip视频在线 | 法国女佣系列在线播放 | 猛男壮男受bl爽哭了高h | 免费观看二十女人一摸是水 | 亚洲免费网站在线观看 | 亚洲国产精品第一区二区三区 | 国产图色 | 免费在线观看日韩 | 成年人免费在线视频 | 国产精品久线观看视频 | 久久内在线视频精品mp4 | 久久伊人免费 | 日本卡一卡2卡3卡4精品卡无人区 | 国产亚洲一区二区三区 |