ConcurrentLinkedQueue读写

3 篇文章 0 订阅
1 篇文章 0 订阅

CAS算法:CAS的语义是“我认为V的值应该为A,如果是,那么将V的 值更新为B,否则不修改并告诉V的值实际为多少”,CAS是项 乐观锁 技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做

入队列:

第一步添加元素1:队列更新head节点的next节点为元素1节点。又因为tail节点默认情况下等于head节点,所以它们的next节点都指向元素1节点。 第二步添加元素2:队列首先设置元素1节点的next节点为元素2节点,然后更新tail节点指向元素2节点。 第三步添加元素3:设置tail节点的next节点为元素3节点。 第四步添加元素4:设置元素3的next节点为元素4节点,然后将tail节点指向元素4节点。

`
public boolean offer(E e) {
if (e == null) throw new NullPointerException();

//入队前,创建一个入队节点
Node<E> n = new Node<E>(e);

retry:
    //死循环,入队不成功反复入队。
    for (;;) {
        //创建一个指向tail节点的引用
        Node<E> t = tail;
        //p用来表示队列的尾节点,默认情况下等于tail节点。
        Node<E> p = t;

        for (int hops = 0; ; hops++) {
            //获得p节点的下一个节点。
            Node<E> next = succ(p);
            //next节点不为空,说明p不是尾节点,需要更新p后在将它指向next节点
            if (next != null) {
                //循环了两次及其以上,并且当前节点还是不等于尾节点
                if (hops > HOPS && t != tail)
                    continue retry;
                p = next;
            }

            //如果p是尾节点,则设置p节点的next节点为入队节点。
            else if (p.casNext(null, n)) {
                //如果tail节点有大于等于1个next节点,则将入队节点设置成tair节点,更新失败了也没关系,因为失败了表示有其他线程成功更新了tair节点
                if (hops >= HOPS)
                    casTail(t, n); // 更新tail节点,允许失败
                return true;
            }

            // p有next节点,表示p的next节点是尾节点,则重新设置p节点
            else {
                p = succ(p);
            }
        }
    }

}
`

博客地址:(链接)[https://my.oschina.net/xianggao/blog/389332]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值