Java 的锁-老王女儿的爱情
对象锁:
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 锁
Java 的锁-老王女儿的爱情的更多相关文章
- 在昨天夜黑风高的晚上,我偷了隔壁老王的Python入门课件,由浅入深堪称完美!
隔壁老王是一个资深码农,就业教育事业的秃顶之才昨天我下楼打酱油,看他迎面走来,满目春光我好奇的问道:老王,有什么好事,隔壁小花叫你上门了吗?老王:秘密!!我心想:哎呦~不错啊半晚之时,连猫狗都睡着了, ...
- java的锁机制
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在Java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个线 ...
- JAVA线程锁-读写锁
JAVA线程锁,除Lock的传统锁,又有两种特殊锁,叫读写锁ReadWriteLock 其中多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥 例子: /** * java线程锁分为读写锁 ReadWri ...
- Java线程锁一个简单Lock
/** * @author * * Lock 是java.util.concurrent.locks下提供的java线程锁,作用跟synchronized类似, * 单是比它更加面向对象,两个线程执行 ...
- paip.提升性能----java 无锁结构(CAS, Atomic, Threadlocal, volatile, 函数式编码, 不变对象)
paip.提升性能----java 无锁结构(CAS, Atomic, Threadlocal, volatile, 函数式编码, 不变对象) 1 锁的缺点 2 CAS(Compare ...
- 老王教您怎么做cass7.1 8.0 9.1所有系列的复制狗 加密狗 破解狗
cass7.1 8.0 9.1所有系列的复制狗 加密狗 破解狗本来是出于好奇看到网上有这样的东西,学了下感觉挺简单的,如果你是cass的初学者想仅仅是想学习这个软件,不想花大价格购买正版的,这个是可以 ...
- 老王Python培训视频教程(价值500元)【基础进阶项目篇 – 完整版】
老王Python培训视频教程(价值500元)[基础进阶项目篇 – 完整版] 教学大纲python基础篇1-25课时1.虚拟机安装ubuntu开发环境,第一个程序:hello python! (配置开发 ...
- javascript 老王开车去东北
[Decode error - output not utf-8] 魔女 飞 奔驰 去 华南 [Finished in 1.1s] 需要变化的对象进行隔离.正是编程的乐趣之处 /** * by Jac ...
- Java偏向锁实现原理(Biased Locking)
http://kenwublog.com/theory-of-java-biased-locking 阅读本文的读者,需要对Java轻量级锁有一定的了解,知道lock record, mark wor ...
随机推荐
- java中的访问修饰符详解
主要讲述一下java中protected的修饰控制范围. 在叙述protected修饰符使用之前,先来说一下java,可以发现,开发java程序是一个时时刻刻都在编写类.开发类.定义类的过程.类里面可 ...
- 项目到上传Gitee
1.码云上创建一个项目 testgit (名字随你) 2.本地创建一个文件夹D:/testgit,然后使用git bash 3.cd 到本地文件夹中D:/testgit, 4.使用 git init ...
- Linux如何删除特殊字符文件名或目录?
通过文件的inode号删除文件 先用ls -i 找出要删除文件的inode 号 2ls -i |grep xxxxxx|awk '{print $2}'|xargs -i rm -f {} xxxxx ...
- delphi 安卓开发常用
delphi 安卓开发有几个常用的pas: FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewTex ...
- Ruby 环境变量
Ruby 环境变量 Ruby 解释器使用下列环境变量来控制它的行为.ENV 对象包含了所有当前设置的环境变量列表. 变量 描述 DLN_LIBRARY_PATH 动态加载模块搜索的路径. HOME 当 ...
- thinkphp Widget扩展
Widget扩展一般用于页面组件的扩展.大理石平台规格 举个例子,我们在页面中实现一个分类显示的Widget,首先我们要定义一个Widget控制器层 CateWidget,如下: namespace ...
- Java语法清单-快速回顾(开发)
Java CheatSheet 01.基础 hello,world! public static void main(String[] args) { System.out.println(" ...
- hdu多校第五场1004 (hdu6627) equation 1 计算几何
题意: 给你一个C,再给你n组a,b,让你求x取什么值的时候,$ \sum_{i=1}^n |a_i*x+b_i| =C $,要求求出解的个数,并用最简分数从小到大表示,如果有无穷多解,输出-1. 题 ...
- struts漏洞处理--老项目struts版本升级遇到的问题
struts漏洞S2-016被扫描出,要求升级struts版本,查看生产struts版本2.0.12,该漏洞影响版本2.3.15以下,上网搜索,struts2.5以上的要求jdk1.7,由于项目过老, ...
- 转-C/C++ new与malloc区别
1.属性 new/delete是C++关键字,需要编译器支持.malloc/free是库函数,需要头文件支持. 2.参数 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计 ...