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