ReadWriteLock读写锁实现线程读写互斥问题
2012-11-27 21:59
197 查看
IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结!
1.Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。2.读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁!
例子程序:
package edu.java5.lock; import java.util.Random; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReadWriteLock { /** * 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。 * 如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁; * 如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。 * 总之,读的时候上读锁,写的时候上写锁! * 题目要求: * 三个线程读数据,三个线程写数据,写数据时不能读数据;读数据时其他线程能读数据但不能写数据; **/ public static void main(String[] args) { final DataOperate dataOperate = new DataOperate(); for (int i = 0; i < 3; i++) { new Thread(new Runnable() { @Override public void run() { while(true){ dataOperate.get(); } } }).start(); new Thread(new Runnable() { @Override public void run() { while(true){ dataOperate.put(new Random().nextInt(1000)); } } }).start(); } } } class DataOperate{ Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程读该数据 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public void get() { lock.readLock().lock(); System.out.println(Thread.currentThread().getName()+" 准备读数据..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"已经读数据"+data); lock.readLock().unlock(); } public void put(int data) { lock.writeLock().lock(); System.out.println(Thread.currentThread().getName()+" 准备写数据"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } this.data = data; System.out.println(Thread.currentThread().getName()+"已经写数据"+data); lock.writeLock().unlock(); } }
相关文章推荐
- 2.使用synchronized关键字实现多线程的同步和互斥(不同线程同时读写同一数据)
- Java总结(十)—实现Runnable接口创建线程,线程安全同步,死锁(哲学家进餐问题),读写锁
- 杂项: 线程的同步于互斥,生产者问题,读写者问题实现
- 线程学习二,notify和wait实现消费者-生产者同步问题
- Qt中采用多线程实现Socket编程-跨线程调用问题
- 多个线程调用同一个处理函数的互斥问题
- 实现线程读写锁的四种方法
- 多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例),停止线程,线程中方法的区别,匿名内部类实现多线程,线程总结
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- 秒杀多线程系列之⑤ 经典线程之同步 关键段实现互斥
- 两个线程同时调用同一个处理函数的互斥问题
- java线程:三种方式实现生产者消费者问题_2
- 用信号量实现进程互斥示例和解决哲学家就餐问题
- 高并发下的线程安全实现——互斥同步
- 进程(线程)间同步互斥问题(四) 三个烟鬼问题
- MFC API实现Excel读写 屏蔽调用SaveAs函数时弹出“文件已存在”问题
- java线程之间的控制,使用Semaphore 实现 互斥
- Linux下信号量实现进程同步、互斥(生产者消费者问题)
- APP 缓存数据线程安全问题,多个线程同时对同一资源进行读写问题