国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 實例講解Java 自旋鎖

實例講解Java 自旋鎖

2020-09-12 23:58java小新人 Java教程

這篇文章主要介紹了Java 自旋鎖的相關資料,幫助大家更好的理解和學習Java并發,感興趣的朋友可以了解下

  一直以來不是怎么清楚自旋鎖,最近有點時間,好好的學習了一下;

  所謂的自旋鎖在我的理解就是多個線程在嘗試獲取鎖的時候,其中一個線程獲取鎖之后,其他的線程都處在一直嘗試獲取鎖的狀態,不會阻塞!!!那么什么叫做一直嘗試獲取鎖呢?就是一個循環,比較經典的是AtomicInteger中的一個updateAndGet方法,下圖所示(當然也可以直接看unsafe類中的getAndAddInt等類似方法);

  我們可以看出在while循環中使用CAS去嘗試更新一個變量,如果更新失敗,就會一直在這個循環中一直在嘗試;成功的話,就可以到最后的return語句;

  由此我們可以大概知道如果自旋的線程過多,那么CPU的資源就會被大量消耗!!!

實例講解Java 自旋鎖

  順便提一個東西叫做原子引用,官方提供了AtomicInteger,AtomicBoolean等原子類,那么如果我們自己定義的類也需要有原子性怎么辦呢?所以官方提供了一個AtomicReference類,可以將我們自己定義的類封裝一下,就成了我們自己的原子類,例如AtomicReference<Student> atomicReference = new AtomicReference<>();,然后我們對Student的實例進行CAS各種CAS操作;

  栗子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package TestMain;
 
 
import lombok.extern.slf4j.Slf4j;
 
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
 
@Slf4j
public class TestMain80 {
  //一個Thread類的原子引用
  AtomicReference<Thread> atomicReference = new AtomicReference<>();
 
  //加鎖的方法
  public void myLock() {
    Thread currentThread = Thread.currentThread();
    log.info("myLock--Thread:{}", currentThread.getName());
    //這個就是自旋鎖的核心,利用CAS比較當前原子引用中是否為null,如果是null,就把當前線程A放到里面去,
    // 此時線程B再到這里,那么就會CAS失敗,一直在while循環中
    while (!atomicReference.compareAndSet(null, currentThread)) {
 
    }
  }
 
  //解鎖的方法
  public void myUnlock() {
    Thread currentThread = Thread.currentThread();
    //CAS比較原子引用中是不是線程A,是的話就更新為null,此時在上面while中一直在自旋的線程B就可以跳出來了
    atomicReference.compareAndSet(currentThread, null);
    log.info("myUnlock--Thread:{}", currentThread.getName());
  }
 
  public static void main(String[] args) {
    TestMain80 testMain80 = new TestMain80();
 
    //線程A,首先加鎖,然后等3秒中,然后釋放鎖
    new Thread(() -> {
      testMain80.myLock();
      try {
        TimeUnit.SECONDS.sleep(3);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      testMain80.myUnlock();
    }, "A").start();
 
    //主線程等1秒,保證A線程先執行
    try {
      TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
 
    //線程B,加鎖再釋放鎖
    new Thread(() -> {
      testMain80.myLock();
      testMain80.myUnlock();
    }, "B").start();
 
 
  }
}

實例講解Java 自旋鎖

  上面的就是一個自旋鎖的栗子,執行結果中首先是執行A線程的myLock方法,獲取鎖成功,之后的B線程雖然也會執行mylock方法,但是會在while循環中一直阻塞,直到線程A調用了myUnlock方法釋放鎖,最后兩行才會打印出來;

以上就是實例講解Java 自旋鎖的詳細內容,更多關于Java 自旋鎖的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/wyq1995/p/12539853.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色接久久| 亚洲 在线| 91春色| 牛牛澡牛牛爽一区二区 | 亚洲色图综合 | 国产精品美女www爽爽爽软件 | 国产成人免费高清激情视频 | 伊人精品成人久久综合软件 | 日穴视频在线观看 | 久久午夜羞羞影院免费观看 | 米奇色网| 91精品观看| 亚洲国产精品久久久久婷婷老年 | 欧美 日韩 中文 | 91在线视频在线 | 久久九九国产精品 | 亚洲精品在线播放 | 欧美精品亚洲精品 | 高清国产一区 | 欧美成人免费网站 | 国产精品视频播放 | 久久久国产精品一区 | 国产一区二区三区免费视频 | 亚洲一区二区精品 | 精品国产乱码一区二区三区 | 在线观看的av | 精品国产乱码久久久久久88av | 欧美一区二区三区在线观看视频 | 日韩理伦片在线观看视频播放 | 欧美在线一区二区 | 国产午夜精品福利 | 国产成人精品久久 | 91精品国产色综合久久不卡蜜臀 | 国产精品免费在线 | 欧美日韩国产在线播放 | 国产美女久久 | 久久久久久99 | www操com | 国产女爽爽视频精品免费 | 这里只有精品视频 | 亚洲国产人午在线一二区 |