zoukankan      html  css  js  c++  java
  • 锁对象-条件对象-synchronized关键字

     1 import java.util.concurrent.locks.Condition;
     2 import java.util.concurrent.locks.Lock;
     3 import java.util.concurrent.locks.ReentrantLock;
     4 
     5 public class BankCondition {
     6     public BankCondition(int n,double initialBalance){
     7         accounts = new double[n];
     8         for(int i=0;i<accounts.length;i++)
     9             accounts[i]=initialBalance;
    10         bankLock =new ReentrantLock();
    11         
    12     }
    13     public  void transfer(int from,int to,double amount)throws InterruptedException
    14     {
    15         bankLock.lock();
    16         try{
    17             while(accounts[from]<amount)
    18                 sufficientFunds.await();
    19             System.out.print(Thread.currentThread());
    20             
    21             accounts[from]-= amount;
    22             System.out.printf("%10.2f from %d to %d",amount,from,to);
    23             accounts[to]+=amount;
    24             System.out.printf("Total Balance: %10.2f%n",getTotalBalance());
    25             sufficientFunds.signalAll();
    26         }
    27         finally
    28         {
    29             bankLock.unlock();
    30         }
    31     }
    32     public  double getTotalBalance()
    33     {
    34         bankLock.lock();
    35         try{
    36             double sum = 0;
    37             for(double a : accounts)
    38                 sum +=a;
    39             return sum;
    40         }
    41         finally
    42         {
    43             bankLock.unlock();
    44         }
    45     }
    46     public int size(){
    47         return accounts.length;
    48     }
    49     
    50     
    51     private final double [] accounts;
    52     private Lock bankLock;
    53     private Condition sufficientFunds;
    54 }

      锁用来保护代码片段,任何时刻只有一个线程执行被保护的对象;

      锁可以管理试图进入被保护代码段的线程;

      锁可以拥有一个或多个相关的条件对象;

      每个条件对象管理那些已经进入被保护代码段但还不能运行的线程。

    Java中的对象都有一个内部锁,如果一个方法用synchronized关键字声明,那么对象的锁将保护整个方法。也就是说,要调用该方法,线程必须获得内部的对象锁。

    public synchronized void method()
    {
        method body;
    }
    等价于:
    public void method(){
        this.intrinsicLock.lock();
        try
        {
            method body;
        }
        finally
        {
            this.intrinsicLock.unlock();
        }
  • 相关阅读:
    mybatis文件映射之select操作返回List集合
    mybatis文件映射之使用#取值时的一些规则
    mybatis文件映射之获取参数值时#和$的区别
    Java之对象池
    Java多线程设计模式(6)两阶段终止模式
    Future和FutureTask
    Java多线程设计模式(3)读写锁模式
    Java中的对象池模式
    创建资源池(对象池)
    Java多线程设计模式之线程池模式
  • 原文地址:https://www.cnblogs.com/happinessqi/p/3435910.html
Copyright © 2011-2022 走看看