• Java高并发程序设计(十)--无锁


    锁是一种悲观策略,总是觉得会出问题,所以小心翼翼地操作。

    无锁是一种乐观策略,总是假设不会出现问题,如果出现问题,那就重新操作。无锁一般使用CAS作为策略。

    比较交换CAS:

    CAS算法包括三个参数:需要更新的变量,预期值,更新值。只有当需要更新的值等于预期值时,说明其他线程没有对它进行操作,使需要更新值等于更新值。

    java.util.concurrent.atomic中,实现了很多无锁的类型:

    用AtomicInteger写个小例子:

    public class demo implements Runnable{
        static AtomicInteger ai=new AtomicInteger();
        public static void main(String[] args) throws InterruptedException {
            ExecutorService es=Executors.newFixedThreadPool(10);
            for(int i=0;i<10;i++)
            {
                es.submit(new demo());
            }
            Thread.sleep(1000);
            System.out.println(ai);
        }
        public void run() {
            for(int i=0;i<100;i++)
            {
                ai.incrementAndGet();
            }
        }
    }

    没有加锁的情况下,输出结果为1000,AtomicXX的操作都是具有原子性的,具体方法可以自己看API。

    我们接下来看一下incrementAndGet()方法:

    public final int incrementAndGet() {
            for (;;) {
                int current = get();
                int next = current + 1;
                if (compareAndSet(current, next))
                    return next;
            }
        }

    如上面对CAS算法的描述一样,不断尝试直到成功,进入compareAndSet():

    public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
        }

    调用了unsafe类的compareAndSwapInt,只需要知道他的大概意思就行,通过字段偏移量找到位置,通过期望值与待更新值的对比决定要不要更新。

  • 相关阅读:
    SpringMVC+Shiro权限管理(转载)
    面试常见问题(转载)
    JavaScript 五种(非构造方式)继承
    JavaScript 五种(构造方式)继承
    Quartz.Net 基于XML配置启动
    jexus防止产生 *.core文件
    Last-Modified、ETag、Expires和Cache-Control
    正则表达式记录
    C# 操作mongodb子文档
    ASP.NET Core "完整发布,自带运行时" 到jexus
  • 原文地址:https://www.cnblogs.com/blogofjzq/p/9437738.html
Copyright © 2020-2023  润新知