对象锁:
new一个对象,都会给这个实例创建一把锁,对象中的方法必须在实例创建后,通过调用方法获取锁,一个线程进去这个方法之前拿到对象的锁,才能调用方法,否则被阻塞,举个例子,老王有个如花似玉的女儿,小张很爱慕,但是小张必须见到老王(A a = new A();),通过老王的肯定才能和对方的女儿交往(a.lock());
如果见不到老王,就别想和老王女儿见面(获取锁才能获取共享的资源的操作权利);
小张获取了老王的认可, 和老王女儿交往了,现在小李也喜欢美女,老王说,不能脚踏两只船,等他们分手再说,小李就一直等,后来终于分手了,小李就和美女见面,开始了恋爱。(共享资源在一个线程获取到锁,另一个线下会等待)
可重入锁:
老王有两个女儿,小李都喜欢,老王肯定了小李的为人,说,和我大女儿谈,不适合分手,不用再找我,就可以跟我小女儿谈,
Lock和sync锁 :
因为老王(sync)不通人情,考察的重点比较多,想和老王女儿谈恋爱太难 了;
就通过媒婆(lock),小刘通过媒婆介绍,约了美女。过了两个月不合适,恋爱结束,媒婆直接把小刘劝走了,然后把下一个候选人小杜介绍来了。(lock 锁 有个lock 方法加锁, unlock 方法解锁,控制共享代码 的执行权)
这里,老王效率低,媒婆效率高(jdk1.6之前),后面,老王感觉女儿毕竟亲生的,又做了变通(锁优化。不要当场见面啦,打个电话也行,没房没车没存款也凑合,能陪我老头喝酒也可以
),
公平锁:
老王(非公平锁)是个俗人,追求女儿人很多,有些人排了好长时间队,但是老王说,高富帅什么的优先;导致一堆追求者生气,(sync 是个非公平锁, 锁放开,所有的线程都有获取锁的权利)
媒婆(非公平锁)不一样,每个单身狗都交钱了,客户上地,可以按照排队顺序约美女。(默认也是非公平锁,但是可以开启公平锁)
锁中断:
老王和霸道说,你既然追求我女儿了,就必须等,不能放弃,放弃就是瞧不起我,等一年等三年,也得等,谁叫你喜欢过我女儿,(sync 锁, 一个线程再进入 同步方法的时候, 拿不到锁就一直等, 一会等拿到锁, 才能往后面走)
媒婆不一一样,毕竟做生意的,说,那个妹子太难追求,你换一个吧,不收你钱,(lock 锁可以控制中断 , 如果一个线程长时间没获取锁, 可以中断)
非自旋锁:
小何爱慕美女好久,之前老王这么说,追求我女儿?我女儿条件好,等哪天她单身了,我打电话给你,虽然真单身了,但是老王喝酒忘了!小何多等了三年。(每个线程再阻塞就会等待)
自旋锁:
小何说,女神啊女神,等到你爸的电话,我估计都老了,就不断打电话骚扰老王,每天打几个,老王这边也是没办法,终于女儿说失恋了,老王马上打电话给小何说,你去谈恋爱吧,别他妈打我电话了。(自旋锁会 自旋,询问是否锁放开了,非自旋不会)
锁消除:
老谢也有个女儿,长相不敢恭维。已经30岁没人要,老谢说,我不管你了,谁要你就要,不要房不要车。(锁消除会消除安全代码的锁)
细分锁粒度:
小李和美女谈恋爱,又是看电影买花,又是天天唱歌送礼物,搞浪漫,花了一堆时间,效率极低,小唐看着着急,直接送了一步保时捷,不必要的步骤就过了,然后就和美女同居了,
偏向锁:
jdk6做的锁优化,对象头存储状态,继续举例子,小唐和美女热恋,每次来到老王家里,老王都要去开门,累的要死,后来想到个主意,安装一个机器,把小唐头像和女儿的恋爱状态存进去,如果是热恋,并且男朋友还是小唐,就自动开门,自己啥也不管(偏向锁在对象的对象头有个状态位 ,而且记录的当前获取锁的线程ID, 如果是1 并且当前线程ID, 当该线程再进入方法, 不会加锁)
轻量级锁:
女儿还是热恋状态,但是发现,男朋友不是之前考察过得小唐,老王赶紧丢下自己的事,把新男朋友拉到小仓库拷问,你老婆和你妈掉到水里你先救谁,简单问了个问题,感觉很满意,就说你们谈吧,(偏向锁升级为轻量级锁)
独占锁(排他锁):
女儿不能脚踏两只船,一次只能一个人谈。
非独占锁(共享锁):
主要针对的是读操作, 老王的女儿 虽然不能同时交往, 但是所有单身男青年都有看 美女的权利
悲观锁:
老王(sync)和媒婆 lock 都是 悲观锁,认为竞争一定会发生。女儿条件这么优秀, 管你是王思聪还是胡歌, 必须通过老王的考核。
乐观锁:
1 、mysql ,有版本号的概念,比如加个字段,获取上条记录版本号, update,如果是1 , 就成功, 是0就没更新。
2、Java atomic 包下的类, 基于 CAS,compare and swap,不用锁的,使用 volatile 关键字, 保证可见性, 也可以说, volatile 是一种轻量级的 synchronized 锁