黑马程序员技术交流社区

标题: 多线程,同步问题 [打印本页]

作者: 戴进飘    时间: 2012-10-30 18:10
标题: 多线程,同步问题
本帖最后由 戴进飘 于 2012-10-31 14:07 编辑

多线程,同步问题:
为什么老师写的又没有出现错误,我的就出现错误了。郁闷呀!
  1. public class DuoXianCheng_TwelveDay {

  2.         public static void main(String[] args) {

  3.                 Ticket t = new Ticket();
  4.                
  5.                 /* 创建多个线程 */
  6.                 Thread t1 = new Thread(t);        //创建一个线程
  7.                 Thread t2 = new Thread(t);        //创建一个线程
  8.                 Thread t3 = new Thread(t);        //创建一个线程

  9.                 t1.start();                                        //起动t1线程
  10.                 t2.start();                                        //起动t2线程
  11.                 t3.start();                                        //起动t3线程
  12.         }
  13. }

  14. class Ticket implements Runnable {
  15.         private int tick = 100;
  16.         private boolean b = true;

  17.         public void run() {
  18.                 while (b) {
  19.                         synchronized (new Object()) {
  20.                                 if (tick > 0) {
  21.                                         //让线程休眠(暂停执行),10毫秒
  22.                                         try {
  23.                                                 Thread.sleep(10);
  24.                                         } catch (InterruptedException e) {
  25.                                                 e.printStackTrace();
  26.                                         }
  27.                                         System.out.println(Thread.currentThread().getName() + "......."
  28.                                                         + tick--);
  29.                                 } else {
  30.                                         b = false;
  31.                                 }
  32.                         }
  33.                 }
  34.         }
  35. }
复制代码

作者: 马振兴    时间: 2012-10-30 18:32
复制了下代码。没发现什么错误
LZ你把错误也发上来看看
作者: 王永荣    时间: 2012-10-30 18:35
本帖最后由 王永荣 于 2012-10-30 19:25 编辑

你的错在于synchronized (new Object())这句。
synchronized()中的对象可以看成是锁。
线程想要得到执行,首先必须得到这个锁,并且获得CPU资源,然后才能执行,执行完毕释放锁,下一个持有锁的线程进入CPU执行。
可以想象,这把锁得是固定的吧?就是说,只能是一个固定的对象。
而你的new Object()匿名对象,则完全不是固定的一个实例对象。换言之,线程所获得的锁可能完全不一样。
故而依然会出现同步执行的问题。
这就是为什么毕老师的视频里定义一个obj对象为锁。
其实可以把这些都去掉换成简简单单一个this就解决了。synchronized(this){....}
作者: 樊鹏飞    时间: 2012-10-30 21:11
你的synchronized (new Object()) 中 不应该用new Object()  你这样做使得每个线程执行时都会new Object()  用的根本不是同一个对象  线程的安全问题没有解决 .
同步的前提:  
       A:必须是两个或者两个以上的线程才需要同步。
     B:必须要保证多个线程使用的是同一个锁,才可以实现多个线程被同步
线程安全问题的解决方案:
      A:同步代码块
        锁对象是任意对象。
    B:同步方法
          锁对象是this对象。
    C:静态方法
         锁对象是当前资源对象的字节码文件对象(类名.class)。


你的问题可以将new Object()用this或者Ticket .class代替




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