本帖最后由 ぺsimon☆ 于 2013-5-16 14:46 编辑
- /**
- 需求:简单的买票程序
- 多个窗口买票
- 让线程0执行同步代码块的代码,
- 让线程1执行同步函数的代码
- 问题:老师说同步代码块中的锁和同步函数中的锁要一样,而同步函数的锁是this
- 所以构造代码块中的锁也要是this,这样我就不懂了
-
-
- 问题1:以下的程序是Thread0先开启,判断flag=true,然后拿到了构造代码块中的锁this,这时this是Thread0对象
- Thread0线程运行了一会儿,Thread1线程开启了,判断flag=false,然后拿到了同步函数中的锁,就运行同步函数show()方法,老师说
- 同步函数的锁是this,那么这时this就代表Thread1对象了,那么同步代码块中的锁和同步函数中的锁就不就变成一样了吗,程序就不同步了
- 怎么程序运行结果是正确的呢?
-
-
- 问题2:假设现在构造代码块中的锁和构造函数中的锁是一样的,那么当Thread0开启之后,只要Thread0没有运行完,那么Thread1不是就进不去吗,
- 为什么控制台上面还有Thread1的打印结果呢?
- */
- class Ticket implements Runnable //extends Thread
- {
- private int t=100;
- boolean flag=true;
-
- public void run()
- {
- if(flag)
- while(true)
- {
- synchronized(this)
- {
- if(t>0)
- {
- try{Thread.sleep(10);}catch(Exception e){}
- System.out.println(Thread.currentThread().getName()+"code:"+t--);
- }
- }
- }
-
- else
- while(true)
- show();
- }
- public synchronized void show()
- {
- if(t>0)
- {
- try{Thread.sleep(10);}catch(Exception e){}
- System.out.println(Thread.currentThread().getName()+"show:"+t--);
- }
-
- }
- }
- class TicketDemo
- {
- public static void main(String[] args)
- {
- Ticket t=new Ticket();
- Thread t1=new Thread(t);
- Thread t2=new Thread(t);
-
- t1.start();
- try{Thread.sleep(5);}catch(Exception e){}
- t.flag=false;
- t2.start();
- }
- }
复制代码 |