JUC之LockSupport---------多線程與高併發

前言

LockSupport的意思就是有兩個方法park()和unpark(thread)控制線程的阻塞和喚醒。park()是說當前線程執行該方法後進入阻塞狀態,須要再調用unpark(thread)解除阻塞限制。若是unpark(thread)先於park()執行,則該次park()不起做用不會使得線程阻塞。
咱們能夠使用它來阻塞和喚醒線程,功能和wait,notify有些類似,可是LockSupport比起wait,notify功能更強大。java

  • wait和notify都是Object中的方法,在調用這兩個方法前必須先得到鎖對象,這限制了其使用場合:只能在同步代碼塊中。
  • 當對象的等待隊列中有多個線程時,notify只能隨機選擇一個線程喚醒,沒法喚醒指定的線程。
package basic.aqs.LockSupport;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

public class TestLockSupport {
    public static void main(String[] args) {
        Thread t = new Thread(()->{
            for (int i = 0; i < 10; i++) {
                System.out.println(i);
                if (i==5)
                    LockSupport.park();
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        });

        t.start();
        try {
            TimeUnit.SECONDS.sleep(8);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("8s sleep done");
        LockSupport.unpark(t);

    }
}
package basic.aqs.LockSupport;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.LockSupport;

/**
 * 官方給的LockSupport示例
 * 實現的是一個先進先出的線程等待隊列
 * 使用park和unpark控制線程的阻塞和喚醒
 */
class FIFOMutex {
    private final AtomicBoolean locked = new AtomicBoolean(false);
    private final Queue<Thread> waiters
            = new ConcurrentLinkedQueue<>();

    public void lock() {
        boolean wasInterrupted = false;
        // publish current thread for unparkers
        waiters.add(Thread.currentThread());

        // Block while not first in queue or cannot acquire lock
        while (waiters.peek() != Thread.currentThread() ||
                !locked.compareAndSet(false, true)) {
            LockSupport.park(this);
            // ignore interrupts while waiting
            if (Thread.interrupted())
                wasInterrupted = true;
        }

        waiters.remove();
        // ensure correct interrupt status on return
        if (wasInterrupted)
            Thread.currentThread().interrupt();
    }

    public void unlock() {
        locked.set(false);
        LockSupport.unpark(waiters.peek());
    }

    static {
        // Reduce the risk of "lost unpark" due to classloading
        Class<?> ensureLoaded = LockSupport.class;
    }
}

結尾

本文到這裏就結束了,感謝看到最後的朋友,都看到最後了,點個贊再走啊,若有不對之處還請多多指正。
重要的事情說三遍: 關注我 關注我 關注我 !!!!
關注我帶你解鎖更多精彩內容ide

相關文章
相關標籤/搜索