java并发之父doug lea-金沙1005

java并发之父doug lea_高并发多线程javajava实现同步互斥访问有两种方式,synchronized和lock。sychronized是java实现的内置锁,由jvm实现。通过编译synchronized代码块为字节码可以发现,加锁逻辑被翻译为monitorenter和monitorexit两条指令。synchronized是对象锁,锁

java实现同步互斥访问有两种方式,synchronized和lock。

sychronized是java实现的内置锁,由jvm实现。通过编译synchronized代码块为字节码可以发现,加锁逻辑被翻译为monitorenter和monitorexit两条指令。synchronized是对象锁,锁的是monitor对象,对于锁的实现这里不再解释,其由jvm实现,实现原理reentrantlock的原理类似,都是获取不到锁,线程会被挂起在一个队列中。

1、编译字节码

javap -verbose xxx

注:xxx为字节码文件,不需要带.class

2、例子

java并发之父doug lea_高并发多线程java

 

可以看出同步代码快的上下被monitorenter和monitorexit两条指令包裹,分别代表加锁和解锁。

 

同时,synchronzed的在1.5版本后还有以一个大优化,就是锁的膨胀升级。在早期版本,synchronized会直接加一把重量级锁。等待锁的线程会被挂起,线程的挂起和激活涉及到从用户态和内核态之间的转换,耗时耗力。在新版本中,synchronized提供了三层锁的升级,从无锁–》偏向锁–》轻量级锁–》重量级锁。

1、锁标识

java对象头中有一段mark word区域,在锁膨胀的过程中,这段空间会标识不同的含义。

java并发之父doug lea_高并发多线程java

 

 2、synchronized锁升级过程

 当线程a来争夺锁的时候,首先对象升级为偏向锁。线程a通过cas操作尝试将锁对象的mark word的线程id设置为自己。

如果a还没释放锁的时候,线程b来争夺锁。b通过cas尝试获取锁,失败后,b会申请将锁升级为轻量级锁。线程a会找一个程序安全点,暂停线程,将锁升级为轻量级锁。线程a会将mark word的值拷贝到线程栈中,并且将锁对象的mark word修改为指向其线程栈中锁记录的指针。

此时线程b会通过自旋来尝试获取锁,若一定次数没有获取,就会申请将锁升级为重量级锁,同时进入阻塞状态。等线程a释放锁后,再将线程b唤醒,开启一段新的锁争夺。

java并发之父doug lea_高并发多线程java

 

金沙1005的版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由思创斯整理,转载请注明出处:https://ispacesoft.com/380245.html

(0)


相关推荐

  • java 老师_javaweb用户管理系统教师管理系统

  • java请求中文乱码_sslsocket提供的保护服务器发送一条数据如:java代码bufferedreaderin=newbufferedreader(newinputstreamreader(client.getinputstream()));printwriterout=newprintwriter(client.getoutputstream());out.println(“没有查到该数据。”);//向客户端发送out….

  • java compareto方法_json.parsearray(string,class)[]=plaintext;/*用某种方法获取数据*///正式执行加密操作byteencrypteddata[]=cipher.dofinal(data);returnencrypteddata;}}des解密封装……cipherbyte=cipher.dofinal(data);//加密…());cipher.init(cipher.encr…

  • 第十章 进程间的通信 之 java/android多线程开发(二)(一)java多线程开发(二)android多线程开发2.1)基础使用1、继承thread类(1)简介thread类是java中实现多线程的具体类,封装了所需线程操作。在android开发中用于实现多线程。注:线程对象&运行线程区别线程对象是运行线程的实体,用来控制线程行为的唯一方式。线程对象通过线程类实例化创建,负责控制线程的状态,如:运行、睡眠、挂起/停止。优点…

  • 使用java防止非法请求的方法_java非法参数异常举例1.过滤器publicclassimgfilterimplementsfilter{@overridepublicvoidinit(filterconfigfilterconfig)throwsservletexception{system.out.println(&q

  • java定义运算符号_java中赋值运算符java运算符计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,java也提供了一套丰富的运算符来操纵变量。我们把运算符具体分为:算数运算符,比较运算符,逻辑运算符,位运算符,赋值运算符,条件运算符,instanceof运算符。1.算数运算符算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。操作符名称描述 加法相加运算符两侧的值–减法左操作数减去右操作数*乘法相乘操作符两侧…

  • java简单工厂模式及代码_java编写一个简单的工厂模型简单工厂模式:又叫做静态工厂方法模式,是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式uml图client:客户端,调用工厂类的createproduct()方法来创建产品实例。factory:工厂类,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法createproduct()可以被外界直接调用,创建所需的产品对象。product:抽象的产品类。producta,_java简单工厂模式

    2023年10月14日
  • java面向对象编程总结与反思_java 理解面向对象思想在经过十周的java学习后,我对于原本一窍不通的课程又有了新的理解,它也并不是原本我不认识之前高冷的模样,我在慢慢的接触它,认识它,了解它。但现在为止,我对于我所学习的java中的“面向对象编程”做一个个人总结,其中观点仅代表个人,如有错误,敬请纠正。在我所学习的教材中,将“面向对象编程”分为1,2,3三个章节,我也将我所学习的内容分为三个点来进行总结。面向对象编程1什么是面向对象在这个章节里面,我们知道了什么是面向对象,如果用一个比喻来说的话,面向对象就像是养花一样,买个花瓶,再买束鲜花,不喜_java面向对象实验总结

发表回复

您的电子邮箱地址不会被公开。

联系js555888金沙老品牌

关注“java架构师必看”公众号

回复4,添加站长微信。

附言:ispacesoft.com网而来。

关注微信
网站地图