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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴进飘 中级黑马   /  2012-10-30 18:10  /  1826 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴进飘 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

3 个回复

倒序浏览
复制了下代码。没发现什么错误
LZ你把错误也发上来看看
回复 使用道具 举报
本帖最后由 王永荣 于 2012-10-30 19:25 编辑

你的错在于synchronized (new Object())这句。
synchronized()中的对象可以看成是锁。
线程想要得到执行,首先必须得到这个锁,并且获得CPU资源,然后才能执行,执行完毕释放锁,下一个持有锁的线程进入CPU执行。
可以想象,这把锁得是固定的吧?就是说,只能是一个固定的对象。
而你的new Object()匿名对象,则完全不是固定的一个实例对象。换言之,线程所获得的锁可能完全不一样。
故而依然会出现同步执行的问题。
这就是为什么毕老师的视频里定义一个obj对象为锁。
其实可以把这些都去掉换成简简单单一个this就解决了。synchronized(this){....}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
你的synchronized (new Object()) 中 不应该用new Object()  你这样做使得每个线程执行时都会new Object()  用的根本不是同一个对象  线程的安全问题没有解决 .
同步的前提:  
       A:必须是两个或者两个以上的线程才需要同步。
     B:必须要保证多个线程使用的是同一个锁,才可以实现多个线程被同步
线程安全问题的解决方案:
      A:同步代码块
        锁对象是任意对象。
    B:同步方法
          锁对象是this对象。
    C:静态方法
         锁对象是当前资源对象的字节码文件对象(类名.class)。


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

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马