A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 136616244 中级黑马   /  2014-5-8 10:12  /  1167 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 136616244 于 2014-5-8 21:36 编辑

下面的代码有的机子上会出现死锁,有的机子不会出现
  1. package 多线程;

  2. class 生产者消费者 {
  3. public static void main(String[] args) {
  4. Res r = new Res();
  5. boolean flag = false;
  6. Producer p = new Producer(r);
  7. Consumer c = new Consumer(r);
  8. Thread t = new Thread(p);
  9. Thread t2 = new Thread(c);

  10. t.start();
  11. t2.start();
  12. }
  13. }
  14. class Res{
  15. boolean flag = false;
  16. int count = 0;
  17. public synchronized void setResource(){
  18. count++;
  19. System.out.println(Thread.currentThread().getName()+"生产者------"+count);
  20. }
  21. public synchronized void getResource(){
  22. System.out.println(Thread.currentThread().getName()+"消费者。。。。。。。。。。。。"+count);
  23. }
  24. }
  25. class Producer implements Runnable{
  26. Res r;

  27. Producer(Res r ){
  28. this.r = r;

  29. }
  30. public void run(){
  31. while(true){
  32. if(!(r.flag)){
  33. r.setResource();
  34. r.flag =true;
  35. }

  36. }
  37. }
  38. }
  39. class Consumer implements Runnable{
  40. Res r;
  41. Consumer(Res r){
  42. this.r = r;

  43. }
  44. public void run(){
  45. while(true){
  46. if(r.flag){
  47. r.getResource();
  48. r.flag =false;
  49. }
  50. }

  51. }
  52. }
复制代码

,为啥呢?

评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1 加油!

查看全部评分

6 个回复

倒序浏览
本帖最后由 张然龙 于 2014-5-8 19:19 编辑

死锁是互相持有对方的锁而,而双方都不释放锁,所以进入僵持状态,两个线程都进入睡眠状态,你的代码没有持有对方的锁嵌套,一直用的同一把锁(this),何谈死锁??
你已经用flag控制了程序的流程,根本不用加锁了,而且你的主线程定义了一个无效的flag,如果你想看看死锁  我给你改下代码。

代码如下↓

  1. class Demo4 {
  2.         public static void main(String[] args) {
  3.                 Res r = new Res();
  4.                 Producer p = new Producer(r);
  5.                 Consumer c = new Consumer(r);
  6.                 Thread t = new Thread(p);
  7.                 Thread t2 = new Thread(c);
  8.                 t.start();
  9.                 t2.start();
  10.         }
  11. }
  12. class Res{
  13.         int count = 0;
  14.         Object obj1=new Object();
  15.         public void setResource(){
  16.                 synchronized (obj1) {
  17.                         synchronized(this){
  18.                                 count++;
  19.                                 System.out.println(Thread.currentThread().getName()+"生产者------");
  20.                         }
  21.                 }
  22.         }
  23.         public void getResource(){
  24.                 synchronized (this) {
  25.                         synchronized(obj1){
  26.                                 System.out.println(Thread.currentThread().getName()+"消费者。。。。。。。。。。。。");
  27.                         }
  28.                 }
  29.         }
  30. }
  31. class Producer implements Runnable{
  32.         Res r;
  33.         Producer(Res r ){
  34.                 this.r = r;
  35.         }
  36.         public void run(){
  37.                 while(true){
  38.                         if(true){
  39.                                 r.setResource();
  40.                         }

  41.                 }
  42.         }
  43. }
  44. class Consumer implements Runnable{
  45.         Res r;
  46.         Consumer(Res r){
  47.                 this.r = r;
  48.         }
  49.         public void run(){
  50.                 while(true){
  51.                         if(true){
  52.                                 r.getResource();
  53.                         }
  54.                 }
  55.         }
  56. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 136616244 于 2014-5-8 19:58 编辑
张然龙 发表于 2014-5-8 19:02
死锁是互相持有对方的锁而,而双方都不释放锁,所以进入僵持状态,两个线程都进入睡眠状态,你的代码没有持 ...


我不知道怎么描述,反正这两个线程最后都在做死循环而不打印
!你可以运行看看,但不是所有机子都会出现这状况!
回复 使用道具 举报
136616244 发表于 2014-5-8 19:57
我不知道怎么描述,反正这两个线程最后都在做死循环而不打印
!你可以运行看看,但不是所有机子都会出现 ...

你的flag 控制着两个线程交替循环 你的锁反正是没用上,我运行了,挺好的,交替执行的,其实你这代码不用加锁也能交替运行
回复 使用道具 举报
张然龙 发表于 2014-5-8 20:09
你的flag 控制着两个线程交替循环 你的锁反正是没用上,我运行了,挺好的,交替执行的,其实你这代码不用 ...

你QQ多少
回复 使用道具 举报

631826554.....
回复 使用道具 举报
你只有一个锁 this 不可能出现死锁状态,我运行你的代码也无误.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马