通过CAS避免加锁

package com.guo.day05;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by guo on 2017/6/3.
 */
public class Seqience {
    //    通过加锁防止互斥
    private int value;
    public synchronized int next1(){
        return value++;
    }

    private AtomicInteger count =new AtomicInteger(0);
    private int next2(){
//        循环保证compareAndSet一直进行
//        ABA问题的解决 添加了版本值
        while(true){
            int current = count.get();//读取内存中的值
            int next = current+1;
            //compareAndSet硬件指令一定是原子操作  比较内存的值和现在的值是否有变化
            if(count.compareAndSet(current,next)){
                return next;
            }
        }
    }
}

  

时间: 2024-08-01 05:16:36

通过CAS避免加锁的相关文章

volatile | CAS| ABA

JMM JMM(Java内存模型Java Memory Model)是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段.静态字段和构成数组对象的元素)的访问方式. JMM关于同步的规定: ①线程解锁前,必须把共享变量的值刷新回主内存: ②线程解锁前,必须读取主内存的最新值到自己的工作内存: ③加锁解锁是同一把锁: ①把变量读到各个线程的工作内存中:②线程运算完之后把变量的值改好,然后把它写回主内存:③可见性--让其他线程马上知道这个值: 各个线

并发编程-硬件加持的CAS操作够快么?

Talk is cheap CAS(Compare And Swap),即比较并交换.是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数--内存位置(V).预期原值(A)和新值(B).如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值.否则,处理器不做任何操作.无论位置V的值是否等于A, 都将返回V原有的值. CAS的含义是"我认为V的值应该是A,如果是,那我将V的值更新为B,否则不修改并告诉V的值实际是多少" Show you my co

Java concurrent AQS 源码详解

一.引言 AQS(同步阻塞队列)是concurrent包下锁机制实现的基础,相信大家在读完本篇博客后会对AQS框架有一个较为清晰的认识 这篇博客主要针对AbstractQueuedSynchronizer的源码进行分析,大致分为三个部分: 静态内部类Node的解析 重要常量以及字段的解析 重要方法的源码详解. 所有的分析仅基于个人的理解,若有不正之处,请谅解和批评指正,不胜感激!!! 二.Node解析 AQS在内部维护了一个同步阻塞队列,下面简称sync queue,该队列的元素即静态内部类No

Java并发编程:synchronized和锁优化

每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保证共享变量的修改能及时可见 有效解决重排序问题 语义上来讲,synchronized主要有三种用法: 修饰普通方法,锁的是当前对象实例(this) 修饰静态方法,锁的是当前 Class

lockFreeQueue 无锁队列实现与总结

无锁队列 介绍 在工程上,为了解决两个处理器交互速度不一致的问题,我们使用队列作为缓存,生产者将数据放入队列,消费者从队列中取出数据.这个时候就会出现四种情况,单生产者单消费者,多生产者单消费者,单生成者多消费者,多生产者多消费者.我们知道,多线程往往会带来数据不一致的情况,一般需要靠加锁解决问题.但是,加锁往往带来阻塞,阻塞会带来线程切换开销,在数据量大的情况下锁带来的开销是很大的,因此无锁队列实现势在必行.下面就详细讲一下每种情况的不同实现方法. 单生产者单消费者 从最简单的单生产者单消费者

Java并发编程之ReentrantLock源码分析

ReentrantLock介绍 从JDK1.5之前,我们都是使用synchronized关键字来对代码块加锁,在JDK1.5引入了ReentrantLock锁.synchronized关键字性能比ReentrantLock锁要差,而且ReentrantLock锁功能要比synchronized关键字功能强大. 特点 synchronized关键字和ReentrantLock锁都是重入锁,可重入锁是指当一个线程获取到锁后,此线程还可继续获得这把锁,在此线程释放这把锁前其他线程则不可获得这边锁.相比

ConcurrentHashMap 源码浅析 1.8

一.简介 前面的一篇文章我们介绍了ConcurrentHashMap1.7版本版本的源码介绍,我们知道1.7版本的ConcurrentHashMap采用的是分段锁的思想,提高了锁的数量,提高了并发的特性,但是也有其局限性,例如就是并发的数量也就是锁的数量是不可改变的等:我们今天要介绍的1.8版本的ConcurrentHashMap其实也是采用了多锁的思想,不过在1.8中没有了segments这些东西了,每次锁住的数组中的一个元素或者桶(其实也就是数组或者树的头结点),然后锁也和1.7发生变了,使

Java同步数据结构之ConcurrentLinkedQueue

前言 前面介绍的Queue都是通过Lock锁实现的阻塞队列,今天介绍一种非阻塞队列ConcurrentLinkedQueue,所谓非阻塞,其实就是通过CAS代替加锁来实现的高效的非阻塞队列.当许多线程共享对公共集合的访问时,ConcurrentLinkedQueue是一个合适的选择.与大多数其他并发集合实现一样,该类不允许使用空元素. ConcurrentLinkedQueue是一个基于链表的无界线程安全的先进先出队列.虽然前面介绍的队列也有基于链表的实现,例如LinkedBlockingQue

【Java并发编程】11.P6的offer擦肩而过就因为我不懂synchronized原理

使用 synchronized关键字是并发编程中线程同步的常用手段之一,synchronized是悲观锁,其作用有三个: 互斥性:确保线程互斥的访问同步代,锁自动释放,多个线程操作同个代码块或函数必须排队获得锁,可见性:保证共享变量的修改能够及时可见,获得锁的线程操作完毕后会将所数据刷新到共享内存区有序性:有效解决重排序问题,其用法也有三个:修饰实例方法修饰静态方法修饰代码块1. 修饰实例方法 synchronized关键词作用在方法的前面,用来锁定方法,其实默认锁定的是this对象. publ