更新時(shí)間:2023年04月25日10時(shí)04分 來源:傳智教育 瀏覽次數(shù):
在Java中,自旋是指在多線程編程中,當(dāng)線程嘗試獲得某個(gè)鎖時(shí),如果該鎖已經(jīng)被其他線程占用,線程會(huì)一直循環(huán)檢查該鎖是否被釋放,直到獲取到該鎖為止。這個(gè)循環(huán)等待的過程被稱為自旋。
自旋的主要目的是避免線程切換帶來的開銷。當(dāng)線程需要獲得某個(gè)鎖時(shí),如果該鎖已經(jīng)被其他線程占用,線程會(huì)進(jìn)入等待狀態(tài),操作系統(tǒng)需要進(jìn)行線程切換,從而導(dǎo)致一定的開銷。如果等待時(shí)間很短,那么這種開銷是不必要的。在這種情況下,自旋可以避免線程切換,提高程序的性能。
下面是一個(gè)簡單的代碼演示,其中兩個(gè)線程同時(shí)對(duì)一個(gè)對(duì)象加鎖,其中一個(gè)線程會(huì)通過自旋等待另一個(gè)線程釋放鎖。
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(); } }
在這個(gè)例子中,線程1先獲得鎖并保持5秒鐘,線程2在嘗試獲得鎖時(shí)會(huì)通過自旋等待線程1釋放鎖。當(dāng)線程1釋放鎖后,線程2獲得鎖并輸出信息。
北京校區(qū)