黑马程序员技术交流社区

标题: 同步代码块问题 [打印本页]

作者: 王陶成    时间: 2012-9-21 11:03
标题: 同步代码块问题
本帖最后由 王陶成 于 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();
        }
}

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


作者: 彭润生    时间: 2012-9-21 11:05
本帖最后由 彭润生 于 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();
}
}//解决楼主的疑问了嘛?


作者: 王陶成    时间: 2012-9-21 11:31
彭润生 发表于 2012-9-21 11:05
class Ticket implements Runnable { private static int tickets = 100;
Object obj = new Object();//你 ...

原来如此 ,疏忽了锁的问题,谢啊
作者: 彭润生    时间: 2012-9-21 11:37
王陶成 发表于 2012-9-21 11:31
原来如此 ,疏忽了锁的问题,谢啊

呵呵,细节问题留意一下就可以了




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