多线程四.二-------线程同步重入锁

时间:2021-09-14 13:04:41

 

在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。 ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 

它与使用synchronized方法和块具有相同的基本行为和语义,并且扩展了其能力

 

ReenreantLock类的常用方法有:

ReentrantLock() : 创建一个ReentrantLock实例 

lock() : 获得锁 

unlock() : 释放锁


一个最简单的LOCK

public class LockThread implements Runnable{
   public ReentrantLock lock =new ReentrantLock();
    @Override
    public void run() {
         for (int i = 0; i < 100; i++) {
             lock.lock();
            try{
                i++;
            }catch (Exception e) {
                // TODO: handle exception
            }finally{
               lock.unlock();
            }

        }
        
    }

}
如上可见 ,和synchronized相比,lock锁有这显示的操作过程,需要手动指定,何时枷锁,何时释放,都可以人为控制,所以灵活性比synchronized好很多。


重入锁


 

 

package com.thread.Synchronized;

 

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

 

publicclassSynchronizedBase {

 

   

   private int  count=100;

   

    /*

     *同步代码块

     */

     public  void setRow(int num){

       synchronized (this) {

          count = count+num;

          count = count+10;

     }

     

       } */

   

   

   /*

    *方法中加关键字synchronized同步

    */

  /* private synchronized void setRow(intnum){

     

     count= count+num;

     count= count+10;

      }*/

      

   /*

    *显示LOCK实现同步,不满足条件await()等待,signalAll();唤醒

    */

     public void transfer(int from, int to, double amount) throws InterruptedException
   {
      bankLock.lock();
      try
      {
         while (accounts < amount)
        //不满足条件,等待
            sufficientFunds.await();

       //  System.out.print(Thread.currentThread());
         accounts[from] -= amount;
       //  System.out.printf(" %10.2f from %d to %d", amount, from, to);
         accounts[to] += amount;
       //  System.out.printf(" Total Balance: %10.2f%n", getTotalBalance());
         sufficientFunds.signalAll();
      }
      finally
      {
         bankLock.unlock();
      }
   }

      

    

   

 

}

 

 

 

package com.thread.Synchronized;

 

public class MyThread implements Runnable{

   

  static SynchronizedBasebase ;

  private int num;

 

  MyThread(SynchronizedBase base){

   this.base=base;

  }

 

  @Override

  publicvoid run() {

    for (inti = 0; i < 100; i++) {     

      base.setRow(1);

      System.out.println("账户余额为"+base.getRows());

   }

  }

 

  publicstaticvoid main(String[] args)throws InterruptedException {

   base =new SynchronizedBase();

   MyThread myThread =new MyThread(base);

   Thread thread =new Thread(myThread);

   System.out.println("线程一运行");

   thread.start();

   thread.sleep(100);

   Thread thread2 =new Thread(myThread);

   System.out.println("线程二运行");

   thread2.start();

   Thread thread3 =new Thread(myThread);

   System.out.println("线程三运行");

   thread3.start();

   Thread thread4 =new Thread(myThread);

   System.out.println("线程四运行");

   thread4.start();

  }

}