/*** 例子:创建三个窗口卖票,总票数100张,使用实现Runable接口的方式
*存在线程安全问题,待解决
*
* 1.问题:卖票过程中,出现了重票、错票->线程安全问题
* 2.原因:当某个线程操作车票的过程中,尚未完成操作时,其他线程也参与进来操作车票
* 共享数据(共享信号量):车票数ticket
* 3.解决:锁;
* 4.在java中,通过同步机制来解决线程的安全问题
*
* 方式一:同步代码块
* 关键字
* synchronized(同步监视器)
* {
* //需要被同步的代码
* }
* 1.说明:操作共享数据的代码即为需被同步的代码
* 2.共享数据:多个线程共同操作的变量
* 3.同步监视器,俗称:锁。任何一个类的对象,都可以充当锁。//Object obj=new Object();
* 要求:多个线程必须要共用同一把锁
*
*
*
* 方法二:同步方法
* 如果操作共享数据的代码完整声明在一个方法中,我们不妨将此方法声明为同步的。
* synchronized关键字
* public synchronized void show()
* 同步方法依然涉及同步监视器,只是不需要显示声明
* 非静态的同步方法,同步监视器是this
* 静态的同步方法,同步监视器是当前类本身
*
*
* 5.同步的方式,解决了线程的安全问题。---好处
* 操作同步代码时只能有一个线程参与,其他线程等待,相当于是一个单线程的过程,效率低----局限性
* 死锁问题
* 6.同步监视器是否唯一
*
*@authororz*/
class Window1 implementsRunnable
{private int ticket=100;//同步监视器
Object obj=newObject();
@Overridepublic voidrun() {while (true)
{//同步代码块方法实现数据共享
synchronized(obj)
{if(ticket>0)
{try{
Thread.sleep(100);
}catch(Exception e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":卖票,票号为:"+ticket);
ticket--;
}else{break;
}
}
}
}
}public classWindowTest {public static voidmain(String[] args) {
Window1 w=newWindow1();
Thread t1=newThread(w);
Thread t2=newThread(w);
Thread t3=newThread(w);
t1.setName("窗口一");
t2.setName("窗口二");
t3.setName("窗口三");
t1.start();
t2.start();
t3.start();
}
}