package day6;
/**
* 同步代码块和同步函数
* 对同步函数的锁是否为this的验证
*
* @author mzy
*
* 因为本身同步代码块我们传入的锁对象是当前对象this
* 只要同步函数的锁对象是this的话,那么我们的卖票程序最后的实现就是线程安全的
*
* 这里最后验证就是安全的。
*/
publicclassTest1{
publicstaticvoidmain(String[]args){
Tickettk=newTicket();
Threadt1=newThread(tk);
Threadt2=newThread(tk);
t1.start();
try{
Thread.sleep(1);// 让主线程sleep 10ms
// 这里必须抛出异常
}catch(Exceptione){
}
t2.start();
}
}
classTicketimplements Runnable{
privateintticket=100;
booleanflag=true;
publicvoidrun(){
if(flag){
while(true){
synchronized(this){// 将当期对象作为synchronized 的锁
if(ticket>0){
System.out.println("同步代码块"+Thread.currentThread().getName()+"卖出第"+ticket+"张票");
ticket--;
}
}
}
}else{
while(true){
show();
}
}
}
privatesynchronizedvoidshow(){
if(ticket>0){
System.out.println("同步函数"+Thread.currentThread().getName()+"卖出第"+ticket+"张票");
ticket--;
}
}
}
最后验证的结果得同步函数的锁就是this