java 中的synchronized关键字是悲观锁 也叫独占锁
所谓悲观锁就是某一线程独占资源,其他线程只能干等着,这种锁在高并发中性能很差
还有一种实现锁的方式是乐观锁
乐观锁实际上并不加锁,当计算遇到冲突或者说前后不一致时会重试 直到成功
乐观锁采用的机制叫CAS compare and swap
CAS有3个操作数 内存值V 要跟内存值做比较的值A 和 新值 B
其操作逻辑为
- while(true){
- if(V == A){
- V = B;
- return ;
- }else{
- A = V;
- }
- }
CAS的操作对象为volatile类型
volatile类型变量是:CPU直接读写变量所在的内存 而不是把变量copy到寄存器操作
这样对变量的操作所有线程都是可见的
这样做的结果是减少了并发时冲突的概率 但不能完全避免
- volatile类型:
- 根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。
- 每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。
- 所以,同一变量的值在工作内存和主存中可能不一致。volatile其实是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我。
转自:http://xuliangyong.iteye.com/blog/709811 版权归原创作者所有。
相关推荐
"Java CAS底层实现原理实例详解" Java CAS(Compare And Swap)是一种机制,用于解决多线程并行情况下使用锁造成性能损耗的问题。CAS 的概念是,比较并交换,解决多线程并行情况下使用锁造成性能损耗的一种机制。...
Java提供了多种同步原语来保证线程安全,主要包括关键字volatile、synchronized以及CAS操作。volatile关键字保证了变量的可见性和部分有序性。synchronized关键字提供了互斥访问,可以用于方法或代码块,确保一次...
Java并发编程中的CAS(Compare and Swap)是一种无锁同步机制,它是实现线程安全的关键技术。CAS操作包含三个参数:内存地址V、预期原值A和新值B。当且仅当内存地址V当前存储的值等于预期原值A时,CAS会将V的值更新...
在JDK 5.0中,引入了大量并发改进,包括JVM级别的变化,如引入了Compare-and-Swap(CAS)指令,这是一种轻量级的并发原语,能够在硬件层面支持多线程对共享内存位置的无锁更新。这使得开发者能够创建高度可伸缩的并发...
6. **原子性操作与CAS**:Java提供了一组原子变量类(AtomicInteger、AtomicLong等)和Unsafe类,它们支持无锁编程和CAS(Compare and Swap)操作,用于实现高效且线程安全的更新操作。 7. **并发异常处理**:书中...
4. **原子操作与CAS**:`java.util.concurrent.atomic`包中的原子变量类如`AtomicInteger`提供了无锁编程的能力。比较和交换(CAS)操作是其底层实现的关键,理解CAS的工作原理可以帮助你编写更高效的并发代码。 5....
Java自带的并发框架通过提供高级的并发工具和类,使开发者能够更安全、更高效地编写多线程程序,避免了直接操作底层并发原语带来的复杂性和潜在风险。通过理解和熟练使用这些工具,我们可以构建出更健壮、更具伸缩性...
4. **CAS(Compare and Swap)**:CAS是一种无锁同步原语,它利用硬件提供的原子操作(如CPU的cmpxchg指令),在不使用锁的情况下实现并发操作。Java并发库中的`java.util.concurrent.atomic`包中的原子类如...
CAS并发原语体现在Java语言中就是sun.misc.Unsafe类中的各个方法。 调用Unsafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令。这是一种完全依赖于硬件的功能。 由于CAS是一种系统原语,原语属于操作系统用语范畴,是...
然而,`Unsafe`的存在使得Java能够执行一些低级别的操作,比如直接操作内存、字段偏移量计算、数组元素的直接访问、线程的挂起与恢复以及无锁编程中的CAS操作。 1. 操纵对象属性: `Unsafe`类允许开发者获取对象中...
- CAS在Java中通过`sun.misc.Unsafe`类的原语方法实现,这些方法是native的,直接与硬件交互。 - CAS的缺点包括循环时间长、只能保证单个共享变量的原子操作,以及可能出现ABA问题。 5. **ABA问题**: - 当一个...
本文将全面介绍Java并发编程的基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具以及Executor服务。 1. **基础知识** - **并发与并行**:并发是指多个任务在同一时间段内交替执行,...
4. **锁操作**:UnSafe支持底层的锁原语,如`compareAndSwapInt`、`compareAndSwapLong`等CAS操作,这些是实现非阻塞并发算法的关键。 5. **数组操作**:除了对对象字段的操作,UnSafe还可以直接操作数组,如`...
它使用了自旋锁和CAS(Compare and Swap)原语来减少锁的使用,从而降低线程阻塞。 2. **智能预测**:Caffeine引入了基于LFU(Least Frequently Used)和LFU的变种——LFU-Adaptive,以及基于TTL(Time To Live)的...
这些集合类的设计和实现策略,如分段锁和 CAS(Compare and Swap)操作,对于理解高性能并发编程至关重要。 此外,书中还会讲解如何进行有效的并发测试,包括使用Junit和并发测试工具来发现并修复并发问题。最后,...
4. **并发相关**:提供低级同步原语,如CAS操作、线程调度、volatile读写以及内存屏障。 5. **Memory相关**:直接内存访问,用于高效地读写操作系统内存。 6. **系统相关**:获取系统相关的内存信息,如地址大小、...
在Java中,Unsafe类提供了CAS操作,但这个类不推荐直接使用,通常通过Atomic类(如AtomicInteger)来间接使用。CAS避免了锁的开销,但在高并发场景下可能会导致自旋,消耗CPU资源。 以上就是并发编程DEMO涉及的主要...
它采用了读多写少的并发模型,利用CAS(Compare and Swap)原语和锁分离技术来确保线程安全,减少了同步开销。此外,Caffeine使用了预测式加载(predictive loading)和写后读(write-behind)等策略,预先加载可能...