更新时间: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获得锁并输出信息。