一号和二号合租一间房,里面共用一个卫生间对象,这是要用到synchronized关键字,一号与二号同时使用卫生间时,一个需要wait()等待被唤醒,另外一个使用完之后卫生间对象被释放,这时候刚刚使用的需要进入wait()状态,否则会造成死锁现象,卫生间资源释放之后,还需要唤醒另一个正在监听此对象的线程。

  首先构造一个房间类Room,内部构造一号和二号的对象,Object一个卫生间类,当作被线程监听的类,使用synchronized关键字:

  1. synchronized (toliet) {}

  此时toliet对象被共享{}里面可以给一号和二号的使用操作,而同时该语句在run()方法里面,为了使一号和二号对象调用时不出现死锁。

  

  1. /*
  2. * 一号和二号同租一间房,共同使用一个厕所,先刷牙,在小便,结束
  3. */
  4.  
  5. class Room extends Thread{
  6. static Room p1 = new Room("一号");
  7. static Room p2 = new Room("二号");
  8.  
  9. private String name;//代号
  10.  
  11. static Object toliet = new Object();
  12.  
  13. Room(String name){
  14. this.name = name;
  15. }
  16.  
  17. @Override
  18. public void run() {
  19. // TODO Auto-generated method stub
  20. synchronized (toliet) {//只有获得卫生间的锁,才可以获得卫生间里面资源的使用
  21. if(this.name.equals("一号")){
  22. this.brush();
  23. try {
  24. toliet.wait(); //刷牙完毕之后在门口等待被唤醒
  25. this.relase();//被唤醒之后开始小便,一号小便完之后要唤醒二号
  26. toliet.notify();
  27. } catch (InterruptedException e) {
  28. // TODO Auto-generated catch block
  29. e.printStackTrace();
  30. }
  31. }else{
  32. this.brush();
  33. toliet.notify();//让一号进来,自己等到被唤醒
  34. try {
  35. toliet.wait();
  36. this.relase();
  37. } catch (InterruptedException e) {
  38. // TODO Auto-generated catch block
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43. }
  44.  
  45. //刷牙的方法
  46. public void brush(){
  47. System.out.println(this.name+"正在刷牙");
  48. try {
  49. Thread.sleep(2000);
  50. } catch (InterruptedException e) {
  51. // TODO Auto-generated catch block
  52. e.printStackTrace();
  53. }
  54. System.out.println(this.name+"刷牙完毕");
  55. }
  56.  
  57. //解小便
  58. public void relase(){
  59. System.out.println(this.name+"正在小便");
  60. try {
  61. Thread.sleep(2000);
  62. } catch (InterruptedException e) {
  63. // TODO Auto-generated catch block
  64. e.printStackTrace();
  65. }
  66. System.out.println(this.name+"小便完毕");
  67. }
  68. }
  69.  
  70. public class start {
  71.  
  72. public static void main(String[] args) {
  73. // TODO Auto-generated method stub
  74. Room.p1.start();
  75. Room.p2.start();
  76. }
  77.  
  78. }

  很简单的synchronized关键字使用,两个线程共同监听一个对象,注意逻辑表达不要出现混乱,一个线程被唤醒,另一个立马进入wait()状态,上面是完整代码,同时要注意线程被唤醒,或者进入wait()状态,是共用对象唤醒正在监听的的线程和正在使用该对象的线程,比如:

  1. toliet.wait(); //刷牙完毕之后在门口等待被唤醒
  2. this.relase();//被唤醒之后开始小便,一号小便完之后要唤醒二号
  3. toliet.notify();

  是<Object>toliet.wait()和toliet.notify(),如果此处用this,或者其他的线程对象代替,则会出现死锁。

Java程序设计之合租房synchronized(二)的更多相关文章

  1. 20145213《Java程序设计》实验二Java面向对象程序设计实验报告

    20145213<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装,继承,多态 初步掌握UML建模 熟悉S.O. ...

  2. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  3. 20145308刘昊阳 《Java程序设计》实验二 Java面向对象程序设计 实验报告

    20145308刘昊阳 <Java程序设计>实验二 Java面向对象程序设计 实验报告 实验名称 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面相对象三要素:封 ...

  4. Java程序设计 实验二 Java面向对象程序设计

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:李海空  学号:20135329 成绩:             指导教师:娄嘉鹏 ...

  5. 20145222黄亚奇《Java程序设计》实验二实验报告

    20145222<Java程序设计>第2次实验报告 实验步骤与内容 一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L. ...

  6. 20145221 《Java程序设计》实验报告二:Java面向对象程序设计

    20145221 <Java程序设计>实验报告二:Java面向对象程序设计 实验要求 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  7. 20145317彭垚《Java程序设计》实验二

    20145317<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  8. 20145236 《Java程序设计》实验二实验报告

    北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.08 实验名称: Java面向对象程序设计 实验内容: 初步掌握单元测试和T ...

  9. 20145120 《Java程序设计》实验二实验报告

    20145120 <Java程序设计>实验二实验报告 实验名称:Java面向对象程序设计 实验目的与要求: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握U ...

随机推荐

  1. WCF的Restful和TCP方式调用性能比较

    1. 实验背景关于WCF提供分布式访问服务,最常用的两种方式Restful方式和Tcp方式,在本地测试了一把.结果显示,还是Rest方式,在压力测试下,性能最佳.而且处于跨平台的考虑,和自动化测试方便 ...

  2. workman源代码阅读 - 使用信号处理器实现定时器

    <?php /** * SIGALRM信号处理器注册成功后,在什么情况下进程会收到该信号呢? * * 在Linux系统下,每个进程都有惟一的一个定时器,该定时器提供了以秒为单位的定时功能.在定时 ...

  3. [Cordova] Plugin开发架构

    [Cordova] Plugin开发架构 问题情景 开发Cordova Plugin的时候,侦错Native Code是一件让人困扰的事情,因为Cordova所提供的错误讯息并没有那么的完整.常常需要 ...

  4. 原生HTML5 input type=file按钮UI自定义

    原生<input type="file" name="file" />长得太丑 提升一下颜值 实现方案一.设置input[type=file]透明度 ...

  5. 转载利用伪元素单个颜色实现 hover 和 active 时的明暗变化效果

    1.颜色小tip知识 在背景色上方叠加一个黑色半透明层 rgba(0,0,0,.2) 可以得到一个更暗的颜色 在背景色上方叠加一个白色半透明层 rgba(255,255,255,.2) 可以得到一个更 ...

  6. jQuery用户数字评分效果

    效果预览:http://hovertree.com/texiao/jquery/5.htm HTML文件代码: <!DOCTYPE html> <html xmlns="h ...

  7. 熟悉vs2012IDE

    使用vs2012已经几个月了,深感对开发环境的学习有助于提高开发的效率.现将我的经验总结如下: 一.搜索 vs2012相比vs2010添加了正则搜索,极大的提高了代码的查询效率. 二.重构 同vs20 ...

  8. Struts2(2) —— Action

    Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器拦截请求,创建代理Action对象,执行方法 ...

  9. C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统日志查看功能

    先不说如何实现,先来看看效果图: 读取远程的需要提供下远程的计算用户名和密码即可. 如何实现这个代码功能,请看如下代码部分: 实体类: using System; using System.Colle ...

  10. Android—自定义控件实现ListView下拉刷新

    这篇博客为大家介绍一个android常见的功能——ListView下拉刷新(参考自他人博客,网址忘记了,阅读他的代码自己理解注释的,希望能帮助到大家): 首先下拉未松手时候手机显示这样的界面: 下面的 ...