Heim >Java >javaLernprogramm >So implementieren Sie einen wiedereintrittsfähigen Spinlock in Java
Erklärung
1 Dies bedeutet, dass der Thread, der versucht, die Sperre zu erhalten, nicht blockiert wird, sondern die Sperre über eine Schleife erhält.
2. Vorteile: Reduzieren Sie den Verbrauch von Kontextwechseln.
Nachteil: Schleife verbraucht CPU.
Instanzen
public class ReentrantSpinLock { private AtomicReference<Thread> owner = new AtomicReference<>(); // 可重入次数 private int count = 0; // 加锁 public void lock() { Thread current = Thread.currentThread(); if (owner.get() == current) { count++; return; } while (!owner.compareAndSet(null, current)) { System.out.println("--我在自旋--"); } } //解锁 public void unLock() { Thread current = Thread.currentThread(); //只有持有锁的线程才能解锁 if (owner.get() == current) { if (count > 0) { count--; } else { //此处无需CAS操作,因为没有竞争,因为只有线程持有者才能解锁 owner.set(null); } } } public static void main(String[] args) { ReentrantSpinLock spinLock = new ReentrantSpinLock(); Runnable runnable = () -> { System.out.println(Thread.currentThread().getName() + "开始尝试获取自旋锁"); spinLock.lock(); try { System.out.println(Thread.currentThread().getName() + "获取到了自旋锁"); Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } finally { spinLock.unLock(); System.out.println(Thread.currentThread().getName() + "释放了了自旋锁"); } }; Thread thread1 = new Thread(runnable); Thread thread2 = new Thread(runnable); thread1.start(); thread2.start(); } }
Das obige ist der detaillierte Inhalt vonSo implementieren Sie einen wiedereintrittsfähigen Spinlock in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!