java自旋锁的代码实现

自旋锁:spinlock

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

代码:

import java.util.concurrent.TimeUnit;
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)) {

        }
    }

    public void myUnlock() {
        Thread thread = Thread.currentThread();
        atomicReference.compareAndSet(thread, null);
        System.out.println(Thread.currentThread().getName() + "\t invoked myUnlock()");
    }

    public static void main(String[] args) {
        SpinLockDemo spinLockDemo = new SpinLockDemo();
        new Thread(() -> {
            spinLockDemo.myLock();
            try {
                TimeUnit.SECONDS.sleep(5);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            spinLockDemo.myUnlock();
        }, "AA").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        }catch (InterruptedException e){
            e.printStackTrace();
        }

        new Thread(() -> {
            spinLockDemo.myLock();
            try {
                TimeUnit.SECONDS.sleep(1);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            spinLockDemo.myUnlock();
        }, "BB").start();
    }
}

  

原文地址:https://www.cnblogs.com/sunliyuan/p/12436777.html

时间: 2024-10-25 08:04:25

java自旋锁的代码实现的相关文章

java 自旋锁

package spinlock; import java.util.concurrent.atomic.AtomicReference; public class SpinLockTest implements Runnable{ private static int count = 0; private static SpinLock spinLock = new SpinLock(); /** * @param args */ @SuppressWarnings("static-acces

自旋锁原理及java自旋锁

转载:http://blog.csdn.net/sunp823/article/details/49886051 锁的状态:无锁状态.偏向锁状态.轻量级锁状态.重量级锁状态. 偏向锁适用于只有一个线程访问同步块的场景. 轻量级锁的,竞争的线程不会阻塞,适用于持有锁的时间比较短.没有竞争到的线程会自旋来获取锁(自旋的次数这个倒不是非常确定,需要看hotspot源代码来查看,从jni.cpp的monitorenter函数入手),获取失败的话,轻量级锁会膨胀为重量级锁,引起阻塞. 一.自旋锁的概念首先

java自旋锁

一 Test-and-Set Lock 所谓测试设置是最基本的锁,每个线程共用一把锁,进入临界区之前看没有有线程在临界区,如果没有,则进入,并上锁,如果有则等待.java实践中利用了原子的设置state变量来保证一次只有一个线程可以获得到锁. public class TASLock implements Lock { AtomicBoolean state = new AtomicBoolean(false); @Override public void lock() { while (sta

Java线程 - CAS自旋锁(spin-lock)

一.自旋锁提出的背景 由于在多处理器系统环境中有些资源因为其有限性,有时需要互斥访问(mutual exclusion),这时会引入锁的机制,只有获取了锁的进程才能获取资源访问.即是每次只能有且只有一个进程能获取锁,才能进入自己的临界区,同一时间不能两个或两个以上进程进入临界区,当退出临界区时释放锁.设计互斥算法时总是会面临一种情况,即没有获得锁的进程怎么办?通常有2种处理方式.一种是没有获得锁的调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,这就是自旋锁,他不用将县城阻塞起来(NON

并发编程--CAS自旋锁

在前两篇博客中我们介绍了并发编程--volatile应用与原理和并发编程--synchronized的实现原理(二),接下来我们介绍一下CAS自旋锁相关的知识. 一.自旋锁提出的背景 由于在多处理器系统环境中有些资源因为其有限性,有时需要互斥访问(mutual exclusion),这时会引入锁的机制,只有获取了锁的进程才能获取资源访问.即是每次只能有且只有一个进程能获取锁,才能进入自己的临界区,同一时间不能两个或两个以上进程进入临界区,当退出临界区时释放锁.设计互斥算法时总是会面临一种情况,即

什么是自旋锁

多线程中,对共享资源进行访问,为了防止并发引起的相关问题,通常都是引入锁的机制来处理并发问题. 获取到资源的线程A对这个资源加锁,其他线程比如B要访问这个资源首先要获得锁,而此时A持有这个资源的锁,只有等待线程A逻辑执行完,释放锁,这个时候B才能获取到资源的锁进而获取到该资源. 这个过程中,A一直持有着资源的锁,那么没有获取到锁的其他线程比如B怎么办?通常就会有两种方式: 1. 一种是没有获得锁的进程就直接进入阻塞(BLOCKING),这种就是互斥锁 2. 另外一种就是没有获得锁的进程,不进入阻

自旋锁spin_lock和raw_spin_lock

自旋锁spin_lock和raw_spin_lock http://blog.csdn.net/droidphone/article/details/7395983 本文不打算详细探究spin_lock的详细实现机制,只是最近对raw_spin_lock的出现比较困扰,搞不清楚什么时候用spin_lock,什么时候用raw_spin_lock,因此有了这篇文章. /******************************************************************

自旋锁spin_lock和raw_spin_lock(转)

1.  临界区(Critical Section) 我们知道,临界区是指某个代码区间,在该区间中需要访问某些共享的数据对象,又或者是总线,硬件寄存器等,通常这段代码区间的范围要控制在尽可能小的范围内.临界区内需要对这些数据对象和硬件对象的访问进行保护,保证在退出临界区前不会被临界区外的代码对这些对象进行修改.出现以下几种情形时,我们需要使用临界区进行保护: (1)  在可以抢占(preemption)的系统中,两个线程同时访问同一个对象: (2)  线程和中断同时访问同一个对象: (3)  在多

【转】自旋锁spin_lock和raw_spin_lock

本文转自http://blog.csdn.net/droidphone/article/details/7395983 本文不打算详细探究spin_lock的详细实现机制,只是最近对raw_spin_lock的出现比较困扰,搞不清楚什么时候用spin_lock,什么时候用raw_spin_lock,因此有了这篇文章. /*****************************************************************************************