脱离视频,自己写Java实例,带着问题写代码[Java] 纯文本查看 复制代码
public class TicketDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Ticket t = new Ticket();
//4个窗口同时卖票的小事例
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
/*
* Ticket.class 是可以正确执行的类*/
class Ticket implements Runnable
{
private int ticket = 100;
Object obj = new Object();
public void run()
{
while(true)
{
synchronized(obj)
{
if(ticket>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖了第"+(ticket--)+"张票");
}
else
break;//票卖完了,当然要退出线程了。。
}
}
}
}
/*
* TicketErr是引起错误现象的类*/
class TicketErr extends Thread
{
private int ticket = 100;
public void run()
{
while(true)
{
if(ticket>0)
{
/*
* .......
* Thread-3卖了第1张票
Thread-0卖了第0张票
Thread-2卖了第-1张票
Thread-1卖了第-2张票
问题描述:
这四个窗口中出现了错票。
为什么会出现这个问题呢?
是因为:这四个线程在操作同一个资源(票),票还剩1张时,当A线程刚刚判断完ticket>0,还没有
打印出票,CPU执行权就被另一个线程(B)抢去了,B线程判断票也大于0(1>0),
等B线程执行完(也就是票还剩0张),A线程拿到执行权,打印出票信息(卖出-1张)票。
该问题如何解决?
操作同一个资源时,只让进入一个线程进入执行,其他线程排队进入。
要想实现这个方式,则引入锁的机制。将操作资源的代码块“锁”起来
*/
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖了第"+(ticket--)+"张票");
}
else
break;
}
}
}
|