更新時間:2023年04月25日10時04分 來源:傳智教育 瀏覽次數(shù):
在Java中,自旋是指在多線程編程中,當線程嘗試獲得某個鎖時,如果該鎖已經(jīng)被其他線程占用,線程會一直循環(huán)檢查該鎖是否被釋放,直到獲取到該鎖為止。這個循環(huán)等待的過程被稱為自旋。
自旋的主要目的是避免線程切換帶來的開銷。當線程需要獲得某個鎖時,如果該鎖已經(jīng)被其他線程占用,線程會進入等待狀態(tài),操作系統(tǒng)需要進行線程切換,從而導致一定的開銷。如果等待時間很短,那么這種開銷是不必要的。在這種情況下,自旋可以避免線程切換,提高程序的性能。
下面是一個簡單的代碼演示,其中兩個線程同時對一個對象加鎖,其中一個線程會通過自旋等待另一個線程釋放鎖。
public class SpinDemo { private static Object lock = new Object(); public static void main(String[] args) { new Thread(() -> { synchronized (lock) { System.out.println(Thread.currentThread().getName() + " acquired lock."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }, "Thread-1").start(); new Thread(() -> { while (true) { synchronized (lock) { System.out.println(Thread.currentThread().getName() + " acquired lock."); break; } } }, "Thread-2").start(); } }
在這個例子中,線程1先獲得鎖并保持5秒鐘,線程2在嘗試獲得鎖時會通過自旋等待線程1釋放鎖。當線程1釋放鎖后,線程2獲得鎖并輸出信息。