Java程序设计之合租房synchronized(二)
2015-07-31 17:52
330 查看
一号和二号合租一间房,里面共用一个卫生间对象,这是要用到synchronized关键字,一号与二号同时使用卫生间时,一个需要wait()等待被唤醒,另外一个使用完之后卫生间对象被释放,这时候刚刚使用的需要进入wait()状态,否则会造成死锁现象,卫生间资源释放之后,还需要唤醒另一个正在监听此对象的线程。
首先构造一个房间类Room,内部构造一号和二号的对象,Object一个卫生间类,当作被线程监听的类,使用synchronized关键字:
此时toliet对象被共享{}里面可以给一号和二号的使用操作,而同时该语句在run()方法里面,为了使一号和二号对象调用时不出现死锁。
很简单的synchronized关键字使用,两个线程共同监听一个对象,注意逻辑表达不要出现混乱,一个线程被唤醒,另一个立马进入wait()状态,上面是完整代码,同时要注意线程被唤醒,或者进入wait()状态,是共用对象唤醒正在监听的的线程和正在使用该对象的线程,比如:
是<Object>toliet.wait()和toliet.notify(),如果此处用this,或者其他的线程对象代替,则会出现死锁。
首先构造一个房间类Room,内部构造一号和二号的对象,Object一个卫生间类,当作被线程监听的类,使用synchronized关键字:
synchronized (toliet) {}
此时toliet对象被共享{}里面可以给一号和二号的使用操作,而同时该语句在run()方法里面,为了使一号和二号对象调用时不出现死锁。
/* * 一号和二号同租一间房,共同使用一个厕所,先刷牙,在小便,结束 */ class Room extends Thread{ static Room p1 = new Room("一号"); static Room p2 = new Room("二号"); private String name;//代号 static Object toliet = new Object(); Room(String name){ this.name = name; } @Override public void run() { // TODO Auto-generated method stub synchronized (toliet) {//只有获得卫生间的锁,才可以获得卫生间里面资源的使用 if(this.name.equals("一号")){ this.brush(); try { toliet.wait(); //刷牙完毕之后在门口等待被唤醒 this.relase();//被唤醒之后开始小便,一号小便完之后要唤醒二号 toliet.notify(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ this.brush(); toliet.notify();//让一号进来,自己等到被唤醒 try { toliet.wait(); this.relase(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } //刷牙的方法 public void brush(){ System.out.println(this.name+"正在刷牙"); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name+"刷牙完毕"); } //解小便 public void relase(){ System.out.println(this.name+"正在小便"); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name+"小便完毕"); } } public class start { public static void main(String[] args) { // TODO Auto-generated method stub Room.p1.start(); Room.p2.start(); } }
很简单的synchronized关键字使用,两个线程共同监听一个对象,注意逻辑表达不要出现混乱,一个线程被唤醒,另一个立马进入wait()状态,上面是完整代码,同时要注意线程被唤醒,或者进入wait()状态,是共用对象唤醒正在监听的的线程和正在使用该对象的线程,比如:
toliet.wait(); //刷牙完毕之后在门口等待被唤醒 this.relase();//被唤醒之后开始小便,一号小便完之后要唤醒二号 toliet.notify();
是<Object>toliet.wait()和toliet.notify(),如果此处用this,或者其他的线程对象代替,则会出现死锁。
相关文章推荐
- JAVA_RSA密钥生成
- java缓存(3、Oscache和Ehcache)
- java+搜索引擎
- spring mvc @Autowired
- struts2 基于xml 配置文件的输入验证
- spring使用aop时需要设置proxy-target-class="true" 否则无法依赖注入
- 关于Override在JDK1.5和JDK1.6上子类实现接口中方法使用@Override注解编译错误.
- springMVC --配置详细与注解说明
- 【SSH快速进阶】——struts2的模型驱动—ModelDriven
- java中二叉树的创建以及几个常用的函数
- Java CAS理解
- java正则掉坑实录
- java通过Ip地址获取地理位置
- Java中声明常量为什么用static修饰
- Flex数字类型和Java数字类型的比较
- Java读取excel指定sheet中的各行数据,存入二维数组,包括首行,并打印
- MyEclipse10 离线图文安装SVN插件教程
- Java 泛型
- spring mvc controller 传参
- Java集合类总结