知识大全 新特征-锁(下)

Posted 账户

篇首语:古人已用三冬足,年少今开万卷余。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 新特征-锁(下)相关的知识,希望对你有一定的参考价值。

Java线程:新特征-锁(下)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    在上文中提到了Lock接口以及对象 使用它 很优雅的控制了竞争资源的安全访问 但是这种锁不区分读写 称这种锁为普通锁 为了提高性能 Java提供了读写锁 在读的地方使用读锁 在写的地方使用写锁 灵活控制 在一定程度上提高了程序的执行效率       Java中读写锁有个接口ncurrent locks ReadWriteLock 也有具体的实现ReentrantReadWriteLock 详细的API可以查看JavaAPI文档       下面这个例子是在文例子的基础上 将普通锁改为读写锁 并添加账户余额查询的功能 代码如下   import ncurrent ExecutorService; import ncurrent Executors; import ncurrent locks ReadWriteLock; import ncurrent locks ReentrantReadWriteLock; /** * Java线程 锁 * * @author leizhimin : : */ public class Test         public static void main(String[] args)                 //创建并发访问的账户                 MyCount myCount = new MyCount( );                 //创建一个锁对象                 ReadWriteLock lock = new ReentrantReadWriteLock(false);                 //创建一个线程池                 ExecutorService pool = Executors newFixedThreadPool( );                 //创建一些并发访问用户 一个信用卡 存的存 取的取 好热闹啊                 User u = new User( 张三 myCount lock false);                 User u = new User( 张三他爹 myCount lock false);                 User u = new User( 张三他弟 myCount lock false);                 User u = new User( 张三 myCount lock false);                 User u = new User( 张三他爹 myCount lock true);                 //在线程池中执行各个用户的操作                 pool execute(u );                 pool execute(u );                 pool execute(u );                 pool execute(u );                 pool execute(u );                 //关闭线程池                 pool shutdown();          /** * 信用卡的用户 */ class User implements Runnable         private String name;                //用户名         private MyCount myCount;        //所要操作的账户         private int iocash;                 //操作的金额 当然有正负之分了         private ReadWriteLock myLock;                //执行操作所需的锁对象         private boolean ischeck;        //是否查询         User(String name MyCount myCount int iocash ReadWriteLock myLock boolean ischeck)                 this name = name;                 this myCount = myCount;                 this iocash = iocash;                 this myLock = myLock;                 this ischeck = ischeck;                  public void run()                 if (ischeck)                         //获取读锁                         myLock readLock() lock();                         System out println( 读 + name + 正在查询 + myCount + 账户 当前金额为 + myCount getCash());                         //释放读锁                         myLock readLock() unlock();                  else                         //获取写锁                         myLock writeLock() lock();                         //执行现金业务                         System out println( 写 + name + 正在操作 + myCount + 账户 金额为 + iocash + 当前金额为 + myCount getCash());                         myCount setCash(myCount getCash() + iocash);                         System out println( 写 + name + 操作 + myCount + 账户成功 金额为 + iocash + 当前金额为 + myCount getCash());                         //释放写锁                         myLock writeLock() unlock();                           /** * 信用卡账户 可随意透支 */ class MyCount         private String oid;         //账号         private int cash;             //账户余额         MyCount(String oid int cash)                 this oid = oid;                 this cash = cash;                  public String getOid()                 return oid;                  public void setOid(String oid)                 this oid = oid;                  public int getCash()                 return cash;                  public void setCash(int cash)                 this cash = cash;                  @Override         public String toString()                 return MyCount +                                  oid= + oid + \\ +                                  cash= + cash +                                  ;            写 张三正在操作MyCountoid= cash= 账户 金额为 当前金额为 写 张三操作MyCountoid= cash= 账户成功 金额为 当前金额为 写 张三他弟正在操作MyCountoid= cash= 账户 金额为 当前金额为 写 张三他弟操作MyCountoid= cash= 账户成功 金额为 当前金额为 写 张三正在操作MyCountoid= cash= 账户 金额为 当前金额为 写 张三操作MyCountoid= cash= 账户成功 金额为 当前金额为 读 张三他爹正在查询MyCountoid= cash= 账户 当前金额为 写 张三他爹正在操作MyCountoid= cash= 账户 金额为 当前金额为 写 张三他爹操作MyCountoid= cash= 账户成功 金额为 当前金额为 Process finished with exit code       在实际开发中 最好在能用读写锁的情况下使用读写锁 而不要用普通锁 以求更好的性能   cha138/Article/program/Java/hx/201311/25525

相关参考