通过分析,发现打印出0,-1,-2等错误;多线程的运行出现了安全问题。
问题的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完。另一个线程参与进来执行,导致共享数据的错误。
解决办法:对多条操作共享数据的语句,只能让一个线程都执行完 。在执行过程中,其他线程不可以参与执行。java对于多线程的安全问题提供了专业的解决方式,就是同步代码块
synchronized(对象)
{
需要被同步的代码
}
class Ticket implements Runnable//extends Thread
{
private int tick =500;
Object obj = new Object();//建立对象,传参给synchronized同步代码块
public void run()
{
while(true)
{
synchronized(obj)
{
if(tick>0)
{
//不能抛,只能try,因为实现的接口方法没有异常
try
{
Thread.sleep(10);
}
catch(Exception e)
{
}
System.out.println(Thread.currentThread().getName()+"--sale"+tick--);
}
}
}
}
}
class TicketDemo3
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
/*
Ticket t1 = new Ticket();
//Ticket t2 = new Ticket();
//t1.start();
//t2.start();
*/
}
}
网友评论