更新时间:2023年04月25日10时04分 来源:传智教育 浏览次数:

在Java中,自旋是指在多线程编程中,当线程尝试获得某个锁时,如果该锁已经被其他线程占用,线程会一直循环检查该锁是否被释放,直到获取到该锁为止。这个循环等待的过程被称为自旋。
自旋的主要目的是避免线程切换带来的开销。当线程需要获得某个锁时,如果该锁已经被其他线程占用,线程会进入等待状态,操作系统需要进行线程切换,从而导致一定的开销。如果等待时间很短,那么这种开销是不必要的。在这种情况下,自旋可以避免线程切换,提高程序的性能。

下面是一个简单的代码演示,其中两个线程同时对一个对象加锁,其中一个线程会通过自旋等待另一个线程释放锁。
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获得锁并输出信息。