自旋锁解析及自写自旋锁_heaven殇灬的博客-程序员宅基地

技术标签: java  多线程  thread  并发编程  

自旋锁解析及自写自旋锁
1.什么叫自旋锁?
是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样做的好处是减少了线程的上下文切换的消耗,但是缺点是循环会消耗CPU
2.手写自旋锁

package com.example.demo;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

/**
 * Created by Administrator on 2020/7/5.
 * 手写自旋锁
 *
 * @author qtx
 */
public class SpinLockDemo {
    
    AtomicReference<Thread> atomicReference=new AtomicReference<>();

    public  void MyLock(){
    
        //获取当前调用的线程
        Thread thread=Thread.currentThread();
        //期待当前线程是null,则持有锁,否则自选
        while (!atomicReference.compareAndSet(null,thread)){
    
            System.out.println(Thread.currentThread().getName()+"\t No holding lock!");
        }
        System.out.println(Thread.currentThread().getName()+"\t hold lock!");
    }

    public void MyUnLock(){
    
        //获取当前调用的线程
        Thread thread=Thread.currentThread();
        //期待当前线程是null,则持有锁,否则自选
        atomicReference.compareAndSet(thread,null);
        System.out.println(Thread.currentThread().getName()+"\t myUnlock!");
    }
    public static void main(String[] args) {
    
        SpinLockDemo spinLockDemo=new SpinLockDemo();

        new Thread(() -> {
    
            spinLockDemo.MyLock();
            //持锁5s钟
            try {
    
                TimeUnit.SECONDS.sleep(5);
            }catch (Exception e){
    
                e.printStackTrace();
            }
            spinLockDemo.MyUnLock();
        }).start();
        //保证第一个线程先得到锁
        try {
    
            TimeUnit.SECONDS.sleep(1);
        }catch (Exception e){
    
            e.printStackTrace();
        }

        new Thread(() -> {
    
            spinLockDemo.MyLock();
            //持锁2s钟
            try {
    
                TimeUnit.SECONDS.sleep(2);
            }catch (Exception e){
    
                e.printStackTrace();
            }
            spinLockDemo.MyUnLock();
        }).start();
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014385267/article/details/107143446

智能推荐

SpringMVC源码--WebApplicationInitializer(没有XML怎么在Web环境中启动Spring容器)_小雨的光的博客-程序员宅基地

    一直有好奇Spring是怎样做到零XML完成Spring在Web容器中启动的,这篇文章主要介绍WebApplicationInitializer接口。作为本篇的主角, WebApplicationInitializer接口位于org.springframework.web包下。很简单,只有一个方法:public interface WebApplicationInitializer ...

如何开发一个抢单chrome插件_maowenbei的博客-程序员宅基地_抢单插件

出于学写chrome插件&满足买买买心态的目的,试了下从零开始写一个chrome抢单插件。实验的网站是nike和adidas的美国官网。

读写文件操作_a1317338022的博客-程序员宅基地

#include #include void copyFile(){ FILE *in, *out; char ch; if ((in = fopen("in.txt", "r+")) == NULL) //in.txt 和out.txt 都在当前工作目录下存放 { printf("canot find the in.txt file!\n"); exit(0); } i

解决Spyder在File explorer界面卡死的问题_静安寺矿工的博客-程序员宅基地

本人在接触python之前,都是用matlab编写程序,所以比较喜欢使用spyder但spyder有一个很烦人的问题,在file explorer选项卡里切换目录的时候,经常会出现卡死现象,只能关掉spyder重新启动再次启动spyder,切换到file explorer选项卡后,又大概率会卡死。我的系统为Win10 1703 (winver命令查看)spyder出现该问题的原因应是版...

MySQL 主从一致性检查_白开水的日常的博客-程序员宅基地

1.介绍主从一致性主要是通过 Percona-Toolkit 这个工具来实现的,Percona Toolkit 是一组高级的命令行工具,用来管理 MySQL 和系统任务,主要功能包括:验证主节点和复制数据的一致性有效的对记录进行归档找出重复的索引总结 MySQL 服务器从日志和 tcpdump 中分析查询问题发生时收集重要的系统信息。现在,使用这个工具来完成

iOS实时卡顿检测-RunLoop(附实例)_蒲公英_____的博客-程序员宅基地_runloop卡顿

前言在移动设备上开发软件,性能一直是我们最为关心的话题之一,我们作为程序员除了需要努力提高代码质量之外,及时发现和监控软件中那些造成性能低下的”罪魁祸首”也是我们神圣的职责。众所周知,iOS平台因为UIKit本身的特性,需要将所有的UI操作都放在主线程执行,所以也造成不少程序员都习惯将一些线程安全性不确定的逻辑,以及其它线程结束后的汇总工作等等放到了主线,所以主线程中包含的这些大量计算、IO、绘制都有可能造成卡顿。在Xcode中已经集成了非常方便的调试工具Instruments,它可以帮助我们在

随便推点

IIS内部错误:500之解决方案_JoeBlackzqq的博客-程序员宅基地

将自己很早以前做的一个asp.net网站从自己的笔记本上迁移到公司电脑上,在作好相关配置后,打开网站首页,出现HTTP500错误,上网查了发现这是服务器内部错误。接着我查看了下系统事件日志信息,发现了错误: 服务器无法加载应用程序 '/LM/W3SVC'。错误是 '找不到指定的元数据'。根据这个错误信息,在http://www.cnblogs.com/j

【T+】T+普及版和标准版区别_用友搬运工的博客-程序员宅基地

(自行记录,完善ing)T+普及版和标准版区别。

程序员要有持续产出_happydeer的博客-程序员宅基地

优秀的程序员都是行动派!要坚持写代码,最起码要确保用在“做”上面的时间与用在“讨论”上的时间是相当的。

Mapreduce从HBASE抽取数据,生成搜索下拉服务数据,hadoop jar 调用异常问题解决_NBtingwu的博客-程序员宅基地

程序功能:MapReduce程序,从hbase里面取搜索日志,生成搜索下拉服务的数据。问题:  程序采用Extract required libraries into generated jar,packate requited libraries into generated jar打包的时候,在eclipse下debug with configuration,运行正常。  但是用h

【转】Android 平台语音通话及回音消除、噪音消除研究_南国_之恋的博客-程序员宅基地

本文转自博客:https://www.cnblogs.com/jianglijs/p/8583603.html-----------------------------------------------------------------------------------------------------------------------------------------------...

highcharts中如何正确显示时间格式的x轴_FionaMA的博客-程序员宅基地_highchart 时间格式

我从后台取到数据,用highchart绘图后,发现y轴的值和提示框tooltip中显示的都是正确的,但x轴的时间没有正确显示,显示的是1970-01-01。这个问题花了我将近一天的时间,才解决了。查了很多博客,但是没有具体说到怎么解决,我看到最可靠的回答说是series中data的封装不正确。series中data封装格式例子:data:[[Date.UTC(2010,1,