/*
以下这个例子是两个线程卖100张票
两个线程一个线程运行同步代码块,一个线程运行同步函数,都执行买票动作
*/- class Ticket implements Runnable
- {
- private int Ticket=100;
- boolean flag = true;
- Object obj = new Object();
- public void run()
- { if(flag)
- {
- while(true)
- {
- synchronized(obj) //可以验证同步的两个条件,一是多个线程,二是要是同一个锁,当不是同一个锁时,会出线0号票
- {
- if(Ticket>0)
- {
- try{Thread.sleep(20);}catch (Exception e){}
- System.out.println(Thread.currentThread().getName()+"---"+(Ticket--));
- }
- }
- }
- }
- else
- {
- while(true)
- {
- show();
- }
- }
- }
- public synchronized void show() //用的this锁
- {
- if(Ticket>0)
- {
- try{Thread.sleep(20);}catch (Exception e){}
- System.out.println(Thread.currentThread().getName()+"+++"+(Ticket--));
- }
- }
- }
- class ThisLockDemo
- {
- 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){} //首先明白这里一共有3个线程,主线程运行,当t1.start()启动后处于阻塞状态,有运行资格,但没有执行权,因为此时执行权在主线程,当主线程快速执行完之后,t1和t2去执行发现flag编程了false,所以都去执行show方法了。
- t.flag = false; //加延迟时间是为了阻止主线程快速运行完毕。
- t2.start();
-
- }
- }
复制代码 首先明白:同步的条件有连个,一个是至少两个线程,二个是必须是同一个锁,
我的问题就是:当不是同一个锁时,程序出现了0号票,原理是什么
|
|