(转)Java锁、自旋锁、CAS机制

转自:http://www.jb51.net/article/55381.htm

转自:http://blog.csdn.net/aesop_wubo/article/details/7537278

ReentrantLock实现原理源码分析(推荐):

http://huangyunbin.iteye.com/blog/1942313

1. Unsafe类:java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作。

2. ReentrantLock实现原理是基于硬件底层的CAS机制(在java中通过Unsafe提供硬件层原子操作)和计数器来实现的,即递归锁,也就是说同一线程连续递归多次申请同一把锁时,会对该锁进行计数,释放时需要满足计数器为0时,才可释放。

时间: 2024-10-11 09:46:37

(转)Java锁、自旋锁、CAS机制的相关文章

Java线程并发中常见的锁--自旋锁 偏向锁

随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想是,如果程序没有竞争,则取消之前已经取得锁的线程同步操作.也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,就无需再进行相关的同步操作了,从而节约了操作时间,如果在此之间有其他的线程进行了锁请求,则锁退出偏向模式.在JVM中使用-XX:+UseBiasedLocking pac

互斥锁,自旋锁与自适应自旋锁

线程安全与锁的优化 互斥锁: 从 实现原理上来讲,Mutex属于sleep-waiting类型的锁.例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上.假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞 (blocking),Core0 会在此时进行上下文切换(Context Switch)将线程A置于等待队列中,此时Core0就可以运行其他的任务(例如另一个线程C)而不必进

可重入锁 & 自旋锁 & Java里的AtomicReference和CAS操作 & Linux mutex不可重入

之前还是写过蛮多的关于锁的文章的: http://www.cnblogs.com/charlesblc/p/5994162.html <[转载]Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自> http://www.cnblogs.com/charlesblc/p/5935326.html <[Todo] 乐观悲观锁,自旋互斥锁等等> http://www.cnblogs.com/charlesblc/

可重入锁 自旋锁,看这一篇就够了!

在多线程编程中,锁是常用地控制并发的机制,对于临界区的资源,需要保证线程之间互斥地访问. 1. 可重入锁 可重入锁,也叫做递归锁,指的是多次对同一个锁进行加锁操作,都不会阻塞线程.实现思路:记录当前锁正在被哪个线程使用,采用计数来统计lock和unlock的调用次数.正常情况下,lock和unlock的调用次数应该相等,如果不相等就会死锁. public class Test implements Runnable { ReentrantLock lock = new ReentrantLock

检测闩锁/自旋锁争用

1.检测闩锁争用 SELECT wait_type,wait_time_ms,waiting_tasks_count,wait_time_ms/nullif(waiting_tasks_count,0) as avg_wait_time FROM sys.dm_os_wait_stats where wait_type like 'LATCH_%' OR wait_type like 'PAGELATCH_%' OR wait_type like 'PAGEIOLATCH_%' 2.检测自旋锁争

iOS - 互斥锁&amp;&amp;自旋锁 多线程安全隐患(转载)

一.多线程安全隐患 资源共享  一块资源可能会被多个线程共享,也就是多个线程可能会访问到一块资源 比如多个线程访问同一个对象,同一个变量,同一个文件. 当多线程访问同一块资源的时候,很容易引发数据错乱和数据安全问题二.原子和非原子属性 1>OC 在定义属性的时候有nonatomic和atomic两种选择      * atomic:原子属性,为 setter 方法加锁      * nonatomic:非原子属性,不会为 setter 方法加锁        普通情况下都是在主线程做操作,所以一

偏向锁+自旋锁+轻量级锁??????

首先了解对象头MARK(对象头标记,32位): 存储GC标记,对象年龄,对象Hash,锁信息(锁记录的指针,偏向锁线程的ID) 大部分情况是没有竞争的,所以可以通过偏向来提高性能 所谓的偏向,即锁会偏向于当前已经占有锁的线程 ,通过将对象头Mark的标记设置为偏向,并将线程ID写入对象头Mark 只要没有竞争,获得偏向锁的线程,在将来进入同步块,不需要做同步 ,当其他线程请求相同的锁时,偏向模式结束 -XX:+UseBiasedLocking 默认启用 在竞争激烈的场合,偏向锁会增加系统负担 ?

Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等(转)

Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互斥锁 / 读写锁 乐观锁 / 悲观锁 分段锁 偏向锁 / 轻量级锁 / 重量级锁 自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释. 公平锁 / 非公平锁 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公

Java并发编程:Java中的锁和线程同步机制

锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作.Java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败. 悲观

CAS自旋锁

什么是自旋锁 自旋锁要从多线程下的锁机制说起,由于多处理器系统环境中有些资源因为其有限性,有时需要互斥访问(mutual exclusion),这时会引入锁的机制,只有获取了锁的进程才能获取资源访问.即每次只能有且只有一个进程能获取锁,才能进入自己的临界区,同一时间不能两个或两个以上进程进入临界区,当退出临界区时释放锁. 设计互斥算法时总是会面临一种情况,即没有获得锁的进程怎么办? 通常有2种处理方式: 一种是没有获得锁的调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,这就是本文的重点