知识大全 新特征-锁(下)
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相关参考