本帖最后由 何仕映 于 2013-3-21 23:17 编辑
下面这个程序是同步函数和同步代码块的练习,我稍稍改动了一下,我始终不明白0号票,为什么能被打印。在这个代码中,同步的锁我用的是两个不同的锁,就算不是同一个锁,但是在同步代码块中,之中都只有一个线程在执行。并且就算在执行之前几个线程都通过了标志位的判断,释放了执行权。当进入同步代码块中,也有一个if(ticket>0)的判断。如果等于0了,就不会执行if里面的内容了,但是为什么还是可以打出0号票呢?求分- class Ticket implements Runnable
- {
- private int tick = 200;
- boolean flag = true;
- Object obj = new Object();
- public void run()
- {
- while(tick>0)
- {
- if (flag)//如果标志位为真则执行同步函数。
- {
- try{Thread.sleep(40);}catch(Exception e){}
- //为了让几个线程在执行前同步函数前,都通过标志位的判断
- show();
- }
- if(!flag) //如果标志位为假则执行同步代码块
- {
- try{Thread.sleep(100);}catch(Exception e){}
- //为了让几个线程在执行前同步函数前,都通过标志位的判断
- synchronized (obj)
- {
- if(tick>0)
- {
- try{Thread.sleep(40);}catch(Exception e){}
- System.out.println(Thread.currentThread().getName()+"....站票 : "+ tick--);
- flag = true;
- }
- }
- }
- }
- }
- public synchronized void show()//同步函数
- {
- if(tick>0)
- {try{Thread.sleep(10);}catch(Exception e){}
- System.out.println(Thread.currentThread().getName()+"坐票 : "+ tick--);
- flag = false;
- }
- }
- }
- class TicketDemo
- {
- public static void main(String[] args)
- {
- Ticket t = new Ticket();
- Thread t1 = new Thread(t);//创建了一个线程;
- Thread t2 = new Thread(t);//创建了一个线程;
- Thread t3 = new Thread(t);//创建了一个线程;
- Thread t4 = new Thread(t);//创建了一个线程;
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- }
- }
复制代码 析。
|