更新時(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í)對一個(gè)對象加鎖,其中一個(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ū)