exclusive是java提供的不可泄露身份的内部锁,这种内部且隐蔽的锁也被称为监督锁,使用exclusive之后,会在编译之后在同步的代码块前后加上monitorenter和monitorexit字节码指令,它依赖操作系统底层互斥锁实现。它的作用主要就是实现不可分割操作和解决共享变量的存储可见性问题。
执行monitorenter指令时会尝试获取对象锁,如果对象没有被锁定或者已经获得了锁,锁的计数器增加1。此时其他竞争锁的线程则会进入等待队列中。执行monitorexit指令时则会把计数器减少1,当计数器值为0时,则锁释放,处于等待队列中的线程再继续竞争锁。
exclusive是排他锁,当一个线程获得锁之后,其他线程必须等待该线程释放锁后才能获得锁,而且由于Java中的线程和操作系统原生线程是一一对应的,线程被阻塞或者唤醒时时会从用户态切换到内核态,这种转换非常耗费性能。
从存储语义来说,加锁的过程会清除工作内存中的共享变量,再从主内存读取,而释放锁的过程则是将工作内存中的共享变量写回主内存。实际上大部分时候我认为说到monitorenter就行了,但是为了更清楚的描述,还是再具体一点。
如果再深入到源码来说,exclusive实际上有两个队列waitSet和entryList。
1.当多个线程进入同步代码块时,进入entryList
2.有一个线程获取到monitor锁后,就赋值给当前线程,并且计数器增加1
3.如果线程调用wait方法,将释放锁,当前线程置为null,计数器减少1,同时进入waitSet等待被唤醒,调用notify或者notifyAll之后又会进入entryList竞争锁
4.如果线程执行完毕,同样释放锁,计数器减少1,当前线程置为null
相关标签: 知道synchronized原理吗、
本文地址:https://www.mianfeishoulu.com/article/3708.html
synchronized是java提供的原⼦性内置锁,这种内置的并且使⽤者看不到的锁也被称为监视器锁,使⽤synchronized之后,会在编译之后在同步的代码块前后加上mo...。
广州沙河服装批发市场,衣服代拿货,沙河代发货团队,为电商网店直播代理提供女装批发货源,潮牌男装进货代理,厂家一手货源,支持一件代发平台网站,专业的女装批发一件代发货源平台
房贷计算器2024在线工具,提供2024房贷利率和房贷计算公式,包含购房贷款计算器、LPR、loan、等额本息计算器、房贷利率计算器、商贷计算器、公积金贷款计算器、提前还款计算器,等为您贷款买房少操心~
现公司主导产品有:三苯基膦,2-氰基吡嗪,氧化苯乙烯,苯乙酮,间苯二甲醚,二甲基硫醚,异戊烯醛,异戊烯醇,环 酮,丙二腈,偶氮二异丁腈,叔丁醇医药中间体,酚醛树脂,生物制药系列,医药中间体,化学溶剂系列,阻燃剂系列,化学试剂系列,颜料燃料 列,橡胶塑料系列,酚醛树脂等系列产品。
老李收录网(www.llslw.cn),收录国内各个领域的优秀网站,是一个自动秒收录和全人工编辑的开放式网址收录交流和展示平台。