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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王陶成 中级黑马   /  2012-9-21 11:03  /  1312 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王陶成 于 2012-9-21 11:32 编辑

     
           看代码。。。
      
class Ticket implements Runnable {        private static int tickets = 100;
        Object obj = new Object();
        
        public void run() {
                while(true) {
                        synchronized(obj) {//这里 加入了同步代码块
                                if(tickets > 0) {
                                        try {
                                                Thread.sleep(10);
                                                System.out.println(Thread.currentThread().getName() + "买票 : " + tickets--);
                                        }
                                        catch (Exception e) {
                                                System.out.println(e);
                                        }
                                }         
                        }        
                }
        }
}
public class One11_07 {
        public static void main(String[] args) {
                Ticket t1 = new Ticket();
                Ticket t2 = new Ticket();
                Ticket t3 = new Ticket();
                Ticket t4 = new Ticket();
        

               //当分别启动t1,t2,t3,t4四个对象的线程的时候还是会打印出错票
                new Thread(t1).start();
                new Thread(t2).start();
                new Thread(t3).start();
                new Thread(t4).start();
                                

               //当启动4个都是t1对象的线程,就不会出现错票问题
//                new Thread(t1).start();
//                new Thread(t1).start();
//                new Thread(t1).start();
//                new Thread(t1).start();
        }
}

         能不能讲一下这个是什么原因了?

评分

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

查看全部评分

3 个回复

倒序浏览
本帖最后由 彭润生 于 2012-9-21 11:15 编辑

class Ticket implements Runnable { private static int tickets = 100;
Object obj = new Object();//你用的第一个时候,new了四个对象,锁又不是同一个锁,当然会出毛病了,这儿加上static因该就可以了

public void run() {
while(true) {
synchronized(obj) {//这里 加入了同步代码块
if(tickets > 0) {
try {
Thread.sleep(10);
System.out.println(Thread.currentThread().getName() + "买票 : " + tickets--);
}
catch (Exception e) {
System.out.println(e);
}
}
}
}
}
}
public class One11_07 {
public static void main(String[] args) {
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();


//你new了四个对象,用的不是同一个锁,每一个对象都有一个锁,而操作的数据却是通一份数据,所以就出毛病了。把那个锁改成静态的就可以了。
new Thread(t1).start();
new Thread(t2).start();
new Thread(t3).start();
new Thread(t4).start();


////因为这儿是用是同一个锁,当然就没问题了。
// new Thread(t1).start();
// new Thread(t1).start();
// new Thread(t1).start();
// new Thread(t1).start();
}
}//解决楼主的疑问了嘛?

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
彭润生 发表于 2012-9-21 11:05
class Ticket implements Runnable { private static int tickets = 100;
Object obj = new Object();//你 ...

原来如此 ,疏忽了锁的问题,谢啊
回复 使用道具 举报
王陶成 发表于 2012-9-21 11:31
原来如此 ,疏忽了锁的问题,谢啊

呵呵,细节问题留意一下就可以了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马