黑马程序员技术交流社区

标题: 关于多线程的锁的问题 [打印本页]

作者: 无气打火机    时间: 2013-6-22 21:31
标题: 关于多线程的锁的问题
本帖最后由 孙百鑫 于 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--;

                                }
                                
                        }
                }
        }
}
为什么我加了锁之后就一直是一个线程在运行,另一个线程不运行?哪里出错了?求帮忙
作者: peerless2012    时间: 2013-6-22 22:07
你逻辑错了,应该循环放到外面。如果放到里面,一个线程进去,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. }
复制代码

作者: 王磊    时间: 2013-6-23 00:10
楼主用synchronized锁住的是while循环,这样就代表只有循环运行结束,当前线程才会放锁,否则另一个线程永远在锁的外面,也就是while循环的外面等待。当当前线程执行完循环语句,则代表循环已结束,并且放锁。两个线程会继续运行,但是循环内部的判断永远为false,就形成了多线程的死循环。程序无法结束。

改法基本同楼上的,不过补充下,为了代码优化,如果按照楼上朋友的改法,就没必要在定义Object obj = new Object();。因为是无用的资源。可直接用ThreadDemo的对象作为锁,也就是this。
作者: 袁梦希    时间: 2013-6-23 09:03
加油  新人
作者: 无气打火机    时间: 2013-6-23 09:15
袁梦希 发表于 2013-6-23 09:03
加油  新人

谢谢版主的鼓励!嘿嘿
作者: 无气打火机    时间: 2013-6-23 09:15
袁梦希 发表于 2013-6-23 09:03
加油  新人

谢谢版主的鼓励!嘿嘿
作者: HM朱蛟    时间: 2013-6-26 04:43
你把整个循环都锁了  这和锁run方法是一样的啊。。。
作者: 孙百鑫    时间: 2013-6-27 07:42
楼主您好。我已将您的帖子改成已解决。如果帖子发布长时间没加分。及时联系我。以免漏分的情况发生{:soso_e100:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2