热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多线程学习笔记(七)

2019独角兽企业重金招聘Python工程师标准在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象锁的.这也证明在一个syn

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象锁的.这也证明在一个synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的.

public class ThreadReenter {synchronized public void firstService() {System.out.println("This is the first service!");secondService();}synchronized public void secondService() {System.out.println("This is the second service!");thirdService();}synchronized public void thirdService() {System.out.println("This is the third service!");}
}

public class FirstThread extends Thread {@Overridepublic void run(){ThreadReenter threadReenter = new ThreadReenter();threadReenter.firstService();}
}

public class Run {public static void main(String[] args) {FirstThread firstThread = new FirstThread();firstThread.start();}
}

运行结果:

 

可重入锁的概念:

自己可以再次获取自己的内部锁.比如一个线程获取了某个对象的锁,此时这个对象的锁还没有释放,当这个线程想要获取这个对象的锁的时候还是可以获取的,如果不可以锁重入的话,就会造成死锁.

 

注:可重入锁也适用于父子类继承的环境中.

 

public class ThreadReenter {public int i = 10;synchronized public void ancestor(){try{i--;System.out.println("the ancestor i = " + i);Thread.sleep(200);}catch (Exception e){e.printStackTrace();}}}

public class SonOfThreadReenter extends ThreadReenter{synchronized public void Posterity(){try{while(i > 0){i--;System.out.println("the Posterity i = " + i);Thread.sleep(200);this.ancestor();}}catch (Exception e){e.printStackTrace();}}
}

public class FirstThread extends Thread {@Overridepublic void run(){SonOfThreadReenter sonOfThreadReenter = new SonOfThreadReenter();sonOfThreadReenter.Posterity();}
}

public class Run {public static void main(String[] args) {FirstThread firstThread = new FirstThread();firstThread.start();}
}

运行结果:

 

当存在父子类继承时,子类是完全可以通过可重入锁调用父类的同步方法的.


转:https://my.oschina.net/scymore/blog/743597



推荐阅读
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 基于SSM框架的在线考试系统:随机组卷功能详解
    本文深入探讨了基于SSM(Spring, Spring MVC, MyBatis)框架构建的在线考试系统中,随机组卷功能的设计与实现方法。 ... [详细]
  • 深入理解线程池及其基本实现
    本文探讨了线程池的概念、优势及其在Java中的应用。通过实例分析不同类型的线程池,并指导如何构建一个简易的线程池。 ... [详细]
  • Java 中的十进制样式 getZeroDigit()方法,示例 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • 本文详细探讨了在Java编程语言中,构造函数、静态代码块和构造代码块的执行顺序。首先明确了静态代码块、构造代码块以及构造函数方法体的执行优先级,随后深入分析了构造函数体执行前的具体步骤,包括父类构造器的调用、非静态变量的初始化等。 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 本文深入探讨了Go语言中的接口型函数,通过实例分析其灵活性和强大功能,帮助开发者更好地理解和运用这一特性。 ... [详细]
author-avatar
怪物-pp_912
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有