「并发原理专题,【大牛疯狂教学】

    Node node = myNode.get();

    node.locked = true;

    Node pred = tail.getAndSet(node);

    myPred.set(pred);

    while (pred.locked){}

}



public void unLock(){

    Node node = myNode.get();

    node.locked=false;

    myNode.set(myPred.get());

}





static class Node {

    volatile boolean locked = false;

}

}




### []( )MCS锁



MSC与CLH最大的不同并不是链表是显示还是隐式,而是线程自旋的规则不同:CLH是在前趋结点的locked域上自旋等待,而MCS是在自己的结点的locked域上自旋等待。正因为如此,它解决了**CLH在NUMA系统架构中获取locked域状态内存过远的问题 。**



#### []( )MCS锁具体实现规则:



*   a. 队列初始化时没有结点,tail=null

    

*   b. 线程A想要获取锁,将自己置于队尾,由于它是第一个结点,它的locked域为false

    

*   c. 线程B和C相继加入队列,a->next=b,b->next=c,B和C没有获取锁,处于等待状态,所以locked域为true,尾指针指向线程C对应的结点

    

*   d. 线程A释放锁后,顺着它的next指针找到了线程B,并把B的locked域设置为false,这一动作会触发线程B获取锁。

    



public class MCSLock {

private final AtomicReference<Node> tail;



private final ThreadLocal<Node> myNode;



public MCSLock() {

    tail = new AtomicReference<>();

    myNode = ThreadLocal.withInitial(() -> new Node());

}



public void lock() {



    Node node = myNode.get();

    Node pred = tail.getAndSet(node);

    if (pred != null) {

        node.locked = true;

        pred.next = node;

        while (node.locked) {

        }

    }



}



public void unLock() {

    Node node = myNode.get();

    if (node.next == null) {

        if (tail.compareAndSet(node, null)) {

            return;

        }



        while (node.next == null) {

        }

    }

    node.next.locked = false;

    node.next = null;

}



class Node {

    volatile boolean locked = false;

    Node next = null;

}



public static void main(String[] args) {



    MCSLock lock = new MCSLock();



    Runnable task = new Runnable() {

        private int a;



        @Override

        public void run() {

            lock.lock();

            for (int i = 0; i < 10; i++) {

                a++;

                try {

                    Thread.sleep(100);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

            }

            System.out.println(a);

            lock.unLock();

        }

    };



    new Thread(task).start();

    new Thread(task).start();

    new Thread(task).start();

    new Thread(task).start();

最后

如果大家需要这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档的话麻烦点赞

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

image.png

份清华大牛整理的进大厂必备的redis视频、面试题和技术文档的话麻烦点赞**

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!!

感谢大家的支持!!

[外链图片转存中…(img-Jy2dQxdx-1630921587215)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值