学习笔记4-锁相关

1.常见的锁

1.自旋锁:不放弃cpu执行事件,不停地尝试对资源进行访问
2.乐观锁:假设数据没有被更改,在修改数据之前,先读数据,如果数据和之前的不一致,则放弃修改去读取最新数据,然后再尝试修改
3.悲观锁:假设数据一定会被修改,同步所有对数据的访问,从读数据就开始同步
4.独享锁(写):给资源加上写锁,其他线程无法访问,也无法加锁(单写)
5.共享锁(读):给资源加上读锁,其他线程无法加锁,可以读,无法写(多读)
6.可重入锁,不可重入锁:当线程获取到锁时,再访问锁同步的其他内容,无需再次获取锁
7.公平锁,非公平锁:获取锁的顺序,是顺序还是非顺序,先来先得即是公平,后来先至非公平

2.synchronized

1.概念:属于最基本的线程通信机制,基于对象监视器实现,java中每一个对象都与一个监视器相关联,一个线程可以锁定,也可以解锁,一次只有一个线程可以锁定监视器,视图锁定监视器的线程都会进入阻塞,直到再次获得监视器的锁
2.特性:可重入,独享,悲观锁,保证可见性
3.锁的范围:类锁,对象锁,锁消除(比如在方法中使用stringbuffer,会消除stringbuffer的锁,因为方法中是线程独享的,不会有线程安全问题,是java的一些优化手段,减少锁的消耗),锁粗化(例如在for循环内,对i++加锁,java实际运行会扩大锁的范围到for循环外,因为循环加锁没必要,消耗性能,在外面加锁也是一个效果)

3.synchronized实现原理:

几个概念,可以用数据库来类比
堆:数据库
对象:表
头:字段
头这个字段的数据类型是json,json里存有很多属性,比如state属性:01unlock 00轻量级锁 10重量级锁 11被标记回收

具体争抢过程:无锁-偏向锁(主要针对单线程还加了同步关键字,因为java认为大部分时候都是单线程操作,无需加锁,一旦有了线程争抢,就升级轻量级锁 )-轻量级锁-重量级锁

从jdk6开始对锁进行了优化,
偏向锁:头字段中有一个字段表示是否开启偏向锁,另一个字段保存获取偏向锁的线程对象,默认开启偏向锁,第一个线程进入,先看看有没有开启偏向锁,如果开启了,则去将自己设置为偏向锁的所有者,第二个线程来,发现偏向锁有了主人,则会放弃获取锁,此时偏向锁变成关闭状态,后续线程则不会走偏向锁,升级为去获取轻量级锁....
第一个线程获取对象的锁,会尝试去修改状态位为00轻量级锁,修改方式为cas,多个线程只有一个线程可以修改成功,修改不成功的则进入自旋+cas方式尝试修改,但是会限制尝试次数,如果多次尝试仍未获取锁,这些线程会进入对象监视器内,同时锁升级为重量级锁,每个对象都有一个对应的监视器,监视器中存储了锁的当前拥有者,和锁的状态,还有等待锁的线程集合,当线程释放锁之后,这些等待线程重现尝试去获取锁,如此循环.

总结:偏向锁本质就是无锁,jvm为了优化性能,默认是单线程操作,避免频繁使用锁,降低性能.我们平时也许在代码中加了关键字,但实际执行优化后,不一定真的加了锁,而是使用的偏向锁,只有当出现多个线程争抢,才会退出偏向锁,开始使用锁
轻量级锁和重量级锁主要区别是对象监视器出现协调资源争抢

4.Lock锁

1.和synchronized的区别:更加灵活的方式使用锁,提供了tryLock(),尝试一次,获取不到立刻返回,tryLock(1000,Timeunit.secrod),在1秒内不停尝试获取锁,超过时间则立刻返回
2.lock的lock()方法必须放在try中,unlock()放在finally中执行,同一个线程lock可以获取多次,同时也必须释放多次,否则其他线程仍获取不到锁.
3.lock可以使用响应中断的方式lockInterruptibly(),如果使用lock(),则使用Interruptibly()中断时,线程不会立即中断
4.lock锁主要两个实现,包括可重入锁和读写锁
5.读写锁是维护了关联的两个锁,读锁是允许多个线程同时拥有,写锁是独占锁.读写锁适合读多写少的场景,比如缓存
ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
readWriteLock.readLock().lock();
readWriteLock.writeLock().lock();
readWriteLock.readLock().unlock();
6.当有读锁存在,写锁无法获取,读锁可以获取;当有写锁时,只有自己获取读锁,其他线程无法获取,这一过程也叫锁降级,是指在持有写锁的同时,获取读锁,随后释放写锁
7.可以使用读写锁解决缓存雪崩的情况,当读取缓存内容前获取读锁,如果有内容,直接返回内容,并释放锁,否则,将读锁释放,同时获取写锁,这样即使有很多线程想要直接去访问数据库,也只有一个线程能拿到锁去读数据库,然后将数据存入缓存,再次判断缓存是否有内容,其他等待线程就不会访问数据库,而是读取缓存内容,防止大量线程读取数据库,造成数据库奔溃

5.锁的本质--排队

1.同步方式:独享锁(单个队列窗口) 共享锁(多个队列窗口)
2.抢锁的方式:插队抢(非公平锁) 先到先得(公平锁)
3.没抢到锁的方式:快速尝试多次(CAS自旋) 阻塞等待
4.唤醒阻塞方式:叫醒全部 叫醒下一个

6.AQS抽象队列同步器

抽象了资源的获取,释放逻辑
核心3大件就是state状态位:表示当前资源被占用次数,占用次数为0代表未被占用;owner锁的拥有者;队列:阻塞获取资源的线程队列
AQS围绕这三个核心属性,抽象了8个方法,分别是独占资源的释放/尝试释放 和 获取/尝试获取,共享资源的释放/尝试释放 和 获取/尝试获取

读写锁使用AQS实现:读锁操作state字段,state表示当前有多少个读锁,每次加读锁,state++;写锁操作owner字段,如果state>0,代表有读锁存在,写锁线程进入队列等待,有且仅有当前owner是自己,才能将读锁降级为写锁
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342