美文网首页
java中自旋锁的原理

java中自旋锁的原理

作者: 月下饿狼 | 来源:发表于2020-07-07 14:48 被阅读0次

自旋锁:是指尝试获取锁的线程不会立刻阻塞,而是会采用循环的方式去获取锁,直到获取成功。

1.自旋锁的优点:

减少线程上下文切换的消耗
(如果不是自旋机制,那进来发现已经被加锁了,只能线程阻塞住了,只能等待CPU线程调度,在阻塞住,还没调度到其他线程的这段时间内,就是无用时间,也就是相当于线程白白被消耗,不做任何事,这样会降低程序的并发性)

2.自旋锁的缺点:

循环会消耗CUP(有时候运气就是不好,一直自旋比较,都不是期望的值,一直循环,所以会消耗CPU)

自己写个自旋锁,验证下
import java.util.concurrent.atomic.AtomicReference;
/**
 * 自旋锁 测试
 */
public class SpinLockDemo {
    //原子引用线程
    AtomicReference<Thread> atomicReference = new AtomicReference<>();

    public void myLock(){
        Thread thread = Thread.currentThread();
        System.out.println(Thread.currentThread().getName()+"\t come in");

        while(!atomicReference.compareAndSet(null,thread)){

        }
        System.out.println(Thread.currentThread().getName()+"\t getLock");
    }

    public void myUnLock(){
        Thread thread = Thread.currentThread();
        atomicReference.compareAndSet(thread,null);
        System.out.println(Thread.currentThread().getName()+"\t come out");
    }
    public static void main(String[] args) {
        SpinLockDemo spinLockDemo = new SpinLockDemo();

        new Thread(()->{
            spinLockDemo.myLock();
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            spinLockDemo.myUnLock();
        },"AA").start();

        new Thread(()->{
            spinLockDemo.myLock();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            spinLockDemo.myUnLock();
        },"BB").start();
    }
}

结果

AA   come in
BB   come in
AA   getLock
AA   come out
BB   getLock
BB   come out

BB要等AA 锁关闭后,才能获取到锁 一直在自旋比较中

相关文章

网友评论

      本文标题:java中自旋锁的原理

      本文链接:https://www.haomeiwen.com/subject/ctwaqktx.html