毕向东讲解(摘)—7.多线程安全问题(同步函数的锁this验证)

来源:互联网 发布:淘宝上苹果促销代码 编辑:程序博客网 时间:2024/06/04 22:18

package day6;

/**

 * 同步代码块和同步函数

 * 对同步函数的锁是否为this的验证

 *

 * @authormzy

 *

 *  因为本身同步代码块我们传入的锁对象是当前对象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

阅读全文
0 0
原创粉丝点击