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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 无气打火机 中级黑马   /  2013-6-22 21:31  /  2425 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙百鑫 于 2013-6-27 07:42 编辑

public class Test {
        public static void main(String[] args) {

                ThreadDemo tm = new ThreadDemo();
                Thread td1 = new Thread(tm);
                Thread td2 = new Thread(tm);
                td1.start();
                td2.start();
        }
}

public class ThreadDemo implements Runnable {
        public  int ticket = 100;
        Object obj = new Object();

        public void run() {
                synchronized (obj) {  
                        while (true) {
                                try {
                                        Thread.sleep(10);
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                                if (ticket > 0) {
                                        System.out.println(Thread.currentThread().getName()
                                                        + "+++++++" + ticket);
                                        ticket--;

                                }
                                
                        }
                }
        }
}
为什么我加了锁之后就一直是一个线程在运行,另一个线程不运行?哪里出错了?求帮忙

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
你逻辑错了,应该循环放到外面。如果放到里面,一个线程进去,while总是真,直到把票全卖完,另一个线程当然没机会执行了。
  1. public class Test1 {
  2.         public static void main(String[] args) {

  3.                 ThreadDemo tm = new ThreadDemo();
  4.                 Thread td1 = new Thread(tm);
  5.                 Thread td2 = new Thread(tm);
  6.                 td1.start();
  7.                 td2.start();
  8.         }
  9. }

  10. class ThreadDemo implements Runnable {
  11.         public  int ticket = 100;
  12.         Object obj = new Object();

  13.         public void run() {
  14.                
  15.                         while (true) {
  16.                 synchronized (this) {  
  17.                                 try {
  18.                                         Thread.sleep(30);
  19.                                 } catch (InterruptedException e) {
  20.                                         e.printStackTrace();
  21.                                 }
  22.                                 if (ticket > 0) {
  23.                                         System.out.println(Thread.currentThread().getName()
  24.                                                         + "+++++++" + ticket);
  25.                                         ticket--;

  26.                                 }
  27.                                 
  28.                         }
  29.                 }
  30.         }
  31. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
楼主用synchronized锁住的是while循环,这样就代表只有循环运行结束,当前线程才会放锁,否则另一个线程永远在锁的外面,也就是while循环的外面等待。当当前线程执行完循环语句,则代表循环已结束,并且放锁。两个线程会继续运行,但是循环内部的判断永远为false,就形成了多线程的死循环。程序无法结束。

改法基本同楼上的,不过补充下,为了代码优化,如果按照楼上朋友的改法,就没必要在定义Object obj = new Object();。因为是无用的资源。可直接用ThreadDemo的对象作为锁,也就是this。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
加油  新人
回复 使用道具 举报

谢谢版主的鼓励!嘿嘿
回复 使用道具 举报

谢谢版主的鼓励!嘿嘿
回复 使用道具 举报
你把整个循环都锁了  这和锁run方法是一样的啊。。。
回复 使用道具 举报
楼主您好。我已将您的帖子改成已解决。如果帖子发布长时间没加分。及时联系我。以免漏分的情况发生{:soso_e100:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马