验证同步代码块与同步函数的锁【多线程】

    xiaoxiao2021-03-25  48

    转载地址:http://blog.csdn.net/qq_24653023/article/details/51763731

    通过一个卖票问题,验证多线程中同步代码块与同步函数的锁。

    卖票系统,两台机器t1线程和t2线程,共同卖掉100张票。

    [cpp]  view plain  copy  print ? package day13;   public class SynFunctionLockDemo {       public static void main (String[] args){           Ticket t =new Ticket();//一个对象,共享100张票           System.out.println("t   :"+t);           Thread t1 = new Thread(t);           Thread t2 = new Thread(t);           t1.start();           try{Thread.sleep(10);}catch(InterruptedException e){}                      t.flag = false;           t2.start();           /*解释第九行 这一步,          *在主进程main中,t1.start和t2.start以及t.flag=false同时运行到了          *主线程进行了flag->false的过程          *t1和t2线程都只能在flag=false的同步函数中进行          */       }   }   class Ticket implements Runnable{       private int num = 100;       boolean flag =true;       Object obj = new Object();       public void run(){           System.out.println("this:"+this);           if(flag){//同步代码块               for(int i=200;i>1;i--){                   synchronized(obj){                       if(num>0){                           try{Thread.sleep(10);}catch(InterruptedException e){}                           System.out.println(Thread.currentThread().getName()+"...obj..."+num--);                       }                   }               }           }           else{               for(int i=200;i>1;i--)                   show();               }       }       public synchronized void show(){//同步函数           if(num>0){               try{Thread.sleep(10);}catch(InterruptedException e){}               System.out.println(Thread.currentThread().getName()+"...function.."+num--);           }       }   }  

    运行之后,结果会出现第0号票的可能,出现错误,说明同步函数和同步代码块的锁是不相同的。

    如果将28行的synchronized(obj)改成synchronized(this)  

    结果不会出现第0号票,正确,这种改法保证了同步代码块和同步函数锁的一致性,同时也验证同步代码块与同步函数的锁是不一样的。

     

    同步函数的使用的锁是this

    同步函数和同步代码块的区别:

    同步函数的锁是固定的this

    同步代码块的锁是任意的对象。

    建议使用同步代码块。

    通过一个卖票问题,验证多线程中同步代码块与同步函数的锁。

    卖票系统,两台机器t1线程和t2线程,共同卖掉100张票。

    [cpp]  view plain  copy  print ? package day13;   public class SynFunctionLockDemo {       public static void main (String[] args){           Ticket t =new Ticket();//一个对象,共享100张票           System.out.println("t   :"+t);           Thread t1 = new Thread(t);           Thread t2 = new Thread(t);           t1.start();           try{Thread.sleep(10);}catch(InterruptedException e){}                      t.flag = false;           t2.start();           /*解释第九行 这一步,          *在主进程main中,t1.start和t2.start以及t.flag=false同时运行到了          *主线程进行了flag->false的过程          *t1和t2线程都只能在flag=false的同步函数中进行          */       }   }   class Ticket implements Runnable{       private int num = 100;       boolean flag =true;       Object obj = new Object();       public void run(){           System.out.println("this:"+this);           if(flag){//同步代码块               for(int i=200;i>1;i--){                   synchronized(obj){                       if(num>0){                           try{Thread.sleep(10);}catch(InterruptedException e){}                           System.out.println(Thread.currentThread().getName()+"...obj..."+num--);                       }                   }               }           }           else{               for(int i=200;i>1;i--)                   show();               }       }       public synchronized void show(){//同步函数           if(num>0){               try{Thread.sleep(10);}catch(InterruptedException e){}               System.out.println(Thread.currentThread().getName()+"...function.."+num--);           }       }   }  

    运行之后,结果会出现第0号票的可能,出现错误,说明同步函数和同步代码块的锁是不相同的。

    如果将28行的synchronized(obj)改成synchronized(this)  

    结果不会出现第0号票,正确,这种改法保证了同步代码块和同步函数锁的一致性,同时也验证同步代码块与同步函数的锁是不一样的。

     

    同步函数的使用的锁是this

    同步函数和同步代码块的区别:

    同步函数的锁是固定的this

    同步代码块的锁是任意的对象。

    建议使用同步代码块。

    转载请注明原文地址: https://ju.6miu.com/read-34732.html

    最新回复(0)