ReadWriteLock 多线程读写同一个对象的数据是很普遍的,通常,要避免读写冲突,必须保证任何时候仅有一个线程在写入,有线程正在读取的时候,写入操作就必须等待。简单说,就是要避免“写-写”冲突和“读-写”冲突。但是同时读是允许的,因为“读-读”不冲突,而且很安全。
要实现以上的ReadWriteLock,简单的使用synchronized就不行,我们必须自己设计一个ReadWriteLock类,在读之前,必须先获得“读锁”,写之前,必须先获得“写锁”。举例说明:
DataHandler对象保存了一个可读写的char[]数组:
package com.crackj2ee.thread; public class DataHandler { // store data: private char[] buffer = "AAAAAAAAAA".toCharArray(); private char[] doRead() { char[] ret = new char[buffer.length]; for(int i=0; i ret[i] = buffer[i]; sleep(3); } return ret; } private void doWrite(char[] data) { if(data!=null) { buffer = new char[data.length]; for(int i=0; i buffer[i] = data[i]; sleep(10); } } } private void sleep(int ms) { try { Thread.sleep(ms); } catch(InterruptedException ie) {} } }
doRead()和doWrite()方法是非线程安全的读写方法。为了演示,加入了sleep(),并设置读的速度大约是写的3倍,这符合通常的情况。
为了让多线程能安全读写,我们设计了一个ReadWriteLock:
package com.crackj2ee.thread; public class ReadWriteLock { private int readingThreads = 0; private int writingThreads = 0; private int waitingThreads = 0; // waiting for write
复制本页网址和标题,发送给你QQ/Msn的好友一起分享
上一篇:3D编程指南第一部分:快速进入移动JAVA 3D编程世界
下一篇:手机操作系统及移动开发