public class Ta implements Runnable{
int ticket =200;
@Override
public void run() {
//若果锁的位置不对可能出现其他的问题,若加在while(true)上的话,就只能让第一个进 入的线 程 执行 完全部的语句才能跳出循环;
//线程同步锁,若是多个线程同时运行时,会出现一张票被卖多次的情况;线程越多出现的概率就越大;
//这种情况是不允许出现的,所以要给程序加锁;让一个线程进入以后其他的线程只能等待该线程的结束;
//锁可以加在对象上,也可以加在方法语句块的内部,在不影响效率与结果的的情况下尽量减少锁住的内容;
while(true) {
synchronized (this) {//被锁住的地方称为临界区;需要获取的对象称为临界资源;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (ticket>0) {
System.out.println(Thread.currentThread().getName()+"卖掉第"+ticket--+"张票");
}else {
break;
}
}
}
}
int ticket =200;
@Override
public void run() {
//若果锁的位置不对可能出现其他的问题,若加在while(true)上的话,就只能让第一个进 入的线 程 执行 完全部的语句才能跳出循环;
//线程同步锁,若是多个线程同时运行时,会出现一张票被卖多次的情况;线程越多出现的概率就越大;
//这种情况是不允许出现的,所以要给程序加锁;让一个线程进入以后其他的线程只能等待该线程的结束;
//锁可以加在对象上,也可以加在方法语句块的内部,在不影响效率与结果的的情况下尽量减少锁住的内容;
while(true) {
synchronized (this) {//被锁住的地方称为临界区;需要获取的对象称为临界资源;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (ticket>0) {
System.out.println(Thread.currentThread().getName()+"卖掉第"+ticket--+"张票");
}else {
break;
}
}
}
}
}
public class Ticket02 {
public static void main(String[] args) {
Ta ti = new Ta();
Thread t1 = new Thread(ti);
Thread t2 = new Thread(ti);
t1.start();
t2.start();
}
}