java.util.concurrent.locks writeread lock 读写锁【3】
来源:互联网 发布:苹果5是否支持4g网络 编辑:程序博客网 时间:2024/06/07 02:56
</pre>我们使用sychronized或者lock的时候,锁可以对竞争资源提供安全访问,但是读是没有并发问题的,只有写才有并发问题,显然我们都加锁,在读取的时候势必会影响效率。为了提供性能,Java的并发包提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,这样就可以将问题区分开来,一定程度上提升了效率。<p></p><p></p><p>ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的。 </p><p><img src="http://img.blog.csdn.net/20150118190351953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FvZG1s/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p><p></p><p>这里拷贝其他人写的一段代码示例:</p><p></p><pre code_snippet_id="582913" snippet_file_name="blog_20150118_2_3024795" name="code" class="java">import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/**public class Test { public static void main(String[] args) { //创建并发访问的账户 MyCount myCount = new MyCount("95599200901215522", 10000); //创建一个锁对象 ReadWriteLock lock = new ReentrantReadWriteLock(false); //创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(2); //创建一些并发访问用户,一个信用卡,存的存,取的取,好热闹啊 User u1 = new User("张三", myCount, -4000, lock, false); User u2 = new User("张三他爹", myCount, 6000, lock, false); User u3 = new User("张三他弟", myCount, -8000, lock, false); User u4 = new User("张三", myCount, 800, lock, false); User u5 = new User("张三他爹", myCount, 0, lock, true); //在线程池中执行各个用户的操作 pool.execute(u1); pool.execute(u2); pool.execute(u3); pool.execute(u4); pool.execute(u5); //关闭线程池 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 + '}'; }}写:张三正在操作MyCount{oid='95599200901215522', cash=10000}账户,金额为-4000,当前金额为10000写:张三操作MyCount{oid='95599200901215522', cash=6000}账户成功,金额为-4000,当前金额为6000写:张三他弟正在操作MyCount{oid='95599200901215522', cash=6000}账户,金额为-8000,当前金额为6000写:张三他弟操作MyCount{oid='95599200901215522', cash=-2000}账户成功,金额为-8000,当前金额为-2000写:张三正在操作MyCount{oid='95599200901215522', cash=-2000}账户,金额为800,当前金额为-2000写:张三操作MyCount{oid='95599200901215522', cash=-1200}账户成功,金额为800,当前金额为-1200读:张三他爹正在查询MyCount{oid='95599200901215522', cash=-1200}账户,当前金额为-1200写:张三他爹正在操作MyCount{oid='95599200901215522', cash=-1200}账户,金额为6000,当前金额为-1200写:张三他爹操作MyCount{oid='95599200901215522', cash=4800}账户成功,金额为6000,当前金额为4800Process finished with exit code 0
0 0
- java.util.concurrent.locks writeread lock 读写锁【3】
- java.util.concurrent.locks lock锁【2】
- java.util.concurrent.locks.Lock
- java.util.concurrent.locks.Lock
- java.util.concurrent.locks.ReentrantReadWriteLock读写锁源码解析
- java.util.concurrent.locks
- Java中synchronized与java.util.concurrent.locks.Lock区别
- synchronized和java.util.concurrent.locks.Lock的异同
- synchronized 和 java.util.concurrent.locks.Lock 的异同?
- synchronized和java.util.concurrent.locks.Lock的异同
- Synchronized和java.util.concurrent.locks.Lock的区别
- Synchronized和java.util.concurrent.locks.Lock的区别
- synchronized 和java.util.concurrent.locks.Lock 的异同
- 对比synchronized与java.util.concurrent.locks.Lock 的异同
- synchronized和java.util.concurrent.locks.Lock的异同
- 简述synchronized和java.util.concurrent.locks.Lock的异同?
- synchronized和java.util.concurrent.locks.Lock的异同
- 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同 ?
- aabb问题
- 安卓开发之完美解决ADT和SDK不一致问题
- ZOJ 3211 Dream City(DP)
- C# Log4net的使用
- uva1605 - Building for UN 入门经典II 第八章例题8-2
- java.util.concurrent.locks writeread lock 读写锁【3】
- 关于Class.forName(“com.mysql.jdbc.Driver”)
- 免费开源的diff软件“meld”-替代beyond compare的神器
- 查看SDK版本、JDK版本、多个JDK相互切换
- node.js 环境源码安装测试
- ramcloud 5us低时延是如何做到的?
- 如何提高意志力&如何坚持每天学习。
- K-means clustering is not a free lunch
- Failed to opena session for the virtual machine,Unable to load R3