/**
* 2010-10-2
* 线程同步-深入理解
* 几个线程操作共同资源会出现并发问题
* 排队上厕所
*/
package com.thread;
public class Demo5 {
public static void main(String[] args) {
TicketWindow tw = new TicketWindow();
Thread t1 = new Thread(tw);
Thread t2 = new Thread(tw);
Thread t3 = new Thread(tw);
t1.start();
t2.start();
t3.start();
}
}
class TicketWindow implements Runnable {
private int num = 2000;
private MyDog myDOg=new MyDog();
public void run() {
while (true) {
//if else 语句要保证其原子性(同步代码块)
//this代表对象本身 任何一个对象都有对象锁
//并发被控制了
//对象锁默认标志位是1 是1可以进入,进入后标志位变成0,其他线程不能进入,其他线程在等待池中等待
//完成后标志位必须置为1,否则会出现死锁----》避免在一个同步块中的线程去操作另一个线程正在使用的同步块中的资源
/*synchronized (this) {
if (num > 0) {
System.out.println(Thread.currentThread().getName()
+ "正在销售第 " + num + " 张票");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
num--;
} else {
System.out.println("票已经售完");
}
}*/
//任何一个对象都有对象锁,所以可以是任何对象
synchronized (myDOg) {
if (num > 0) {
System.out.println(Thread.currentThread().getName()
+ "正在销售第 " + num + " 张票");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
num--;
} else {
System.out.println("票已经售完");
}
}
}
}
}
class MyDog{
}