用两个线程进行:卖票
class Ticket implements Runnable
{
//将票私有500张票
private int tick = 500;
//定义一个标记,用来调用两个线程
boolean flag = true;
//覆盖runnable中的run方法
public void run()
{
if(flag)
{
//打印车票
while(true)
{
//如果show方法被静态修饰,这里调用的对象是Ticket.class
synchronized(this)//因为run方法调用的show()方法,show方法调用的是this.所以这里是this
{
if(tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread()+"同步售票"+tick--);
}
}
}
}
else
while(true)
show();
}
//对操作共享数据的代码块进行封装
public synchronized void show()
{
if(tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}
//currentThread();获取线程名称
System.out.println(Thread.currentThread()+"..同步函数售票.."+tick--);
}
}
}
public class _线程同步 {
public static void main(String[]args)
{
Ticket t = new Ticket();
//创建线程
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
//当主函数执行到这儿时,让它停留10秒;原因是,main主函数线程会瞬间将两个线程开启执行,
//所以当线程执行到t.falg=false时,会直接执行到show方法
try{Thread.sleep(10);}catch(Exception e){}
t.flag = false;
t2.start();
}
}
通过例子说明:
同步函数使用的锁是this.
降低了线程安全问题,提高了效率
而同步代码块
格式:
synchronized(对象)
{
被同步的代码;
}
它解决了多线程的安全问题。但效率比较低。 |