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 ...
随机推荐
- Delphi 时间函数:关于时间精确的几个函数和方法
//取毫秒级时间精度(方法一): var t1,t2:int64; r1:int64; begin t1:=GetTickCount;//获取开始计数 WINDOWS API sleep(1000); ...
- Perl 运算符
Perl 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号,如: 3+2=5. Perl 语言内置了丰富的运算符,我们来看下常用的几种: 算术运算符 比较运算符 逻辑运算符 赋值运算符 位 ...
- NX二次开发-UFUN信息窗口打印UF_UI_write_listing_window
NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); //方法1(uc1601) uc1601();// ...
- NX二次开发-UFUN拾取屏幕位置UF_UI_specify_screen_position
#include <uf.h> #include <uf_ui.h> UF_initialize(); //拾取屏幕位置 //在屏幕用鼠标拾取一点 char sMessage[ ...
- Mac 精品软件
Snagit:Mac 平台下最优秀的屏幕截图软件,可以录制屏幕视频.截图以及对截图进行加工. Flux 4:强大易用的网页设计工具,不需要学习编程即可在一天内建成一个专业的网站 Jump Deskto ...
- 从[id setValue: forKey:]了解KVC
<Objective-C基础教程> P224页有详细介绍 下边是apple官网的简单介绍 和一个应用的例子. KVC就是Key-value coding,大意是允许通过一个Key来读写一个 ...
- Java习题10.25
Java习题10.25 1. 实际上这道题考查的是两同两小一大原则: 方法名相同,参数类型相同 子类返回类型小于等于父类方法返回类型, 子类抛出异常小于等于父类方法抛出异常, 子类访问权限大于等于父类 ...
- 用python写的自动转发邮件信息模板
# -*- coding:utf-8 -*- #加密东西 def decrypt(key, s): c = bytearray(str(s).encode("gbk")) n = ...
- 【转】Linux(CentOS) vps安装xfce桌面+VNC
以前我发过一篇文章利用vnc远程连接VPS桌面,其中用到的是kde桌面,后来知道xfce总体来说比kde占得内存还小些,因为xfce轻便.简单,今天因为一些原因需要在我的vps上搭建用户桌面,所以就试 ...
- [kuangbin带你飞]专题一 简单搜索 - N - Find a way
正确代码: #include<iostream> #include<queue> #define N 210 #define inf 0xffffff using namesp ...