练习题

同一个类中的2个方法都加了同步锁,多个线程能通知访问同一个类中两

2020-07-11  本文已影响0人  老奶猹

这个问题需要考虑到Lock与synchronized 两种实现锁的不同情形。因为这种情况下使用Lock 和synchronized
会有截然不同的结果。Lock可以让等待锁的线程响应中断,Lock获取锁
使用Lock可以,但使用synchronized不行

public class qq  {
    
    private int count = 0;
    private Lock lock = new ReentrantLock();//设置lock锁
    
    public Runnable run1 = new Runnable(){
         public void run(){
             lock.lock();//加锁
             while(count<1000){
                 try
                 {
                    //打印是否执行了该方法
                    System.out.println(Thread.currentThread().getName()+"run1:"+count++);
                
                 }
                 catch (Exception e)
                 {
                     e.printStackTrace();
                 }
             }
             lock.unlock();
         }
    
    };

    public Runnable  run2 = new Runnable(){
               public void run(){
                   lock.lock();
                   while(count<1000){
                       try
                       {
                        System.out.println(Thread.currentThread().getName()+"run2:"+count++);
                       }
                       catch (Exception e)
                       {
                           e.printStackTrace();
                       }
                   }  
                   lock.unlock();
               }    
    };
    
    public static void main(String[] args) throws InterruptedException
    {
        qq t = new qq();
        new Thread(t.run1).start();
        new Thread(t.run2).start();
    }
}
结果是: 
Thread-0 run1: 0 
Thread-0 run1: 1 
Thread-0 run1: 2 
Thread-0 run1: 3 
Thread-0 run1: 4 
Thread-0 run1: 5 
Thread-0 run1: 6 ........

public class qq  {
    
    private int count = 0;
    private Lock lock = new ReentrantLock();//设置lock锁
    
    public Runnable run1 = new Runnable(){
         public void run(){
        synchronized(this);//将当前类作为锁
             while(count<1000){
                 try
                 {
                    //打印是否执行了该方法
                    System.out.println(Thread.currentThread().getName()+"run1:"+count++);
                
                 }
                 catch (Exception e)
                 {
                     e.printStackTrace();
                 }
             }
        
         }
    
    };

    public Runnable  run2 = new Runnable(){
               public void run(){
                   synchronized(this);//将当前类作为锁
                   while(count<1000){
                       try
                       {
                        System.out.println(Thread.currentThread().getName()+"run2:"+count++);
                       }
                       catch (Exception e)
                       {
                           e.printStackTrace();
                       }
                   }  
                 
               }    
    };
    
    public static void main(String[] args) throws InterruptedException
    {
        qq t = new qq();
        new Thread(t.run1).start();
        new Thread(t.run2).start();
    }
}
结果为: Thread-1 run2: 0 
Thread-1 run2: 1 
Thread-1 run2: 2 
Thread-0 run1: 0 
Thread-0 run1: 4 
Thread-0 run1: 5 
Thread-0 run1: 6     
 ......
上一篇下一篇

猜你喜欢

热点阅读