美文网首页
Java锁之自旋锁

Java锁之自旋锁

作者: bearPotMan | 来源:发表于2019-07-22 21:59 被阅读0次

自旋锁: 是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。
前面讲CAS的文章中其实就已经有涉及到自旋锁相关的知识,只是当时没有过多的去说,比如下面的代码:

public final int getAndAddInt(Object var1, long var2, int var4) {
    int var5;
    do {
        var5 = this.getIntVolatile(var1, var2);
    } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

    return var5;
}

那么我们就来照猫画虎实现一个小案例

public class SpinLockTest {
    public static void main(String[] args) {
        SpinLock lock = new SpinLock();
        new Thread(() -> {
            lock.lock();
            try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}
            lock.unLock();
        }, "t1").start();
        try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}
        new Thread(() -> {
            lock.lock();
            lock.unLock();
        }, "t2").start();
    }
}

class SpinLock {
    AtomicReference<Thread> atomicReference = new AtomicReference<>();
    public void lock() {
        System.out.println(Thread.currentThread().getName() + " called lock()");
        Thread thread = Thread.currentThread();
        do {
//            System.out.println("尝试获取锁...");
        } while (!atomicReference.compareAndSet(null, thread));
    }
    public void unLock() {
        Thread thread = Thread.currentThread();
        atomicReference.compareAndSet(thread, null);
        System.out.println(Thread.currentThread().getName() + " ******called unLock()");
    }
}

运行结果:

t1 called lock()
t2 called lock()
t1 ******called unLock()
t2 ******called unLock()

观察上面的代码,我们没有使用 synchronized关键字,也没有使用 ReentrantLok加锁解锁,而是利用了原子引用以及CAS的 compareAndSet() 方法模拟实现了一个简单的demo。

相关文章

  • 关于自旋锁

    自旋锁是什么? spinlock,不断的自旋(自我循环)尝试获得锁。参考文档:Java中的自旋锁 自旋锁的实现 自...

  • Java主流锁体系+ Synchronized底层原理+ AQS

    Java主流锁体系全面认识:1、乐观锁,悲观锁2、读锁(共亨锁),写锁(排它锁)3、自旋锁,非自旋锁4、无锁,偏向...

  • java同步锁之轻量级锁,重量级锁以及偏向锁

    java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

  • Java锁之自旋锁

    自旋锁: 是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式获取锁,这样的好处是减少线程上下文切换的消耗,缺点是...

  • Java中的锁

    参考: java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁 Java中的锁--朱小厮 乐观锁和悲观锁 宏观...

  • JAVA锁

    概述 JAVA的锁大致可以分为自旋锁和阻塞锁,自旋锁就是拿不到锁就不断循环尝试去拿,阻塞锁是如果拿不到锁线程就阻塞...

  • 自旋锁和互斥锁的区别 java中lock Syntronized

    自旋锁和互斥锁的区别 java中lock Syntronized区别无锁编程以及CAS

  • 记一次面试

    1,java锁,可重入锁,偏向锁,自旋锁 2,spring事务隔离级别,传递特性 3,hashmap,conrre...

  • iOS 开发中加锁

    [1].OSSpinLock 自旋锁 [1]自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被...

  • 谈谈对锁的理解

    参考:通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现! 在并发...

网友评论

      本文标题:Java锁之自旋锁

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