亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java實(shí)現(xiàn)自定義自旋鎖代碼實(shí)例

 更新時(shí)間:2023年10月13日 10:24:14   作者:碼農(nóng)回憶錄  
這篇文章主要介紹了Java實(shí)現(xiàn)自定義自旋鎖代碼實(shí)例,Java自旋鎖是一種線程同步機(jī)制,它允許線程在獲取鎖時(shí)不立即阻塞,而是通過(guò)循環(huán)不斷嘗試獲取鎖,直到成功獲取為止,自旋鎖適用于鎖競(jìng)爭(zhēng)激烈但持有鎖的時(shí)間很短的情況,需要的朋友可以參考下

自旋鎖

1.空輪詢實(shí)現(xiàn)

  • 此處主要利用while空輪詢以及原子包的CAS
package com.gy.spinlock;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * 利用空輪詢實(shí)現(xiàn)
 */
public class SpinLock01 {
    private AtomicInteger state = new AtomicInteger(0);
    public void lock() {
        while (!state.compareAndSet(0, 1)){
        }
    }
    public void unLock() {
        state.compareAndSet(1, 0);
    }
}

2. sleep提升性能

  • 第一種實(shí)現(xiàn)問(wèn)題比較明顯,當(dāng)我們的線程沒(méi)有獲得鎖之前都是空輪詢,此時(shí)我們可以讓沒(méi)有獲取鎖的線程停止
package com.gy.spinlock;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * 利用空輪詢實(shí)現(xiàn)
 */
public class SpinLock01 {
    private AtomicInteger state = new AtomicInteger(0);
    public void lock() {
        while (!state.compareAndSet(0, 1)){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public void unLock() {
        state.compareAndSet(1, 0);
    }
}

3. Unsafe提升性能

  • 第二種方式雖然能讓程序暫停但是sleep的時(shí)間是不好控制的,那么這里有沒(méi)有一種方式可以直接讓程序停止知道unlock的時(shí)候才被喚醒
  • park方法和unPark方法就能實(shí)現(xiàn)這樣的功能
  • 此處unLock處不一定就是unPark的線程獲得鎖
  • 此處加鎖解鎖是否同一線程并未處理,處理方式只需要記錄加鎖線程解鎖時(shí)判斷即可
package com.gy.spinlock;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport;
/**
 * 利用空輪詢實(shí)現(xiàn)
 */
public class SpinLock01 {
    private AtomicInteger state = new AtomicInteger(0);
    private Queue<Thread> queue = new LinkedList();
    public void lock() {
        while (!state.compareAndSet(0, 1)){
            queue.add(Thread.currentThread());
            LockSupport.park();
        }
    }
    public void unLock() {
        state.compareAndSet(1, 0);
        LockSupport.unpark(queue.poll());
    }
}

到此這篇關(guān)于Java實(shí)現(xiàn)自定義自旋鎖代碼實(shí)例的文章就介紹到這了,更多相關(guān)Java自定義自旋鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論