ReadWriteLock(二)

xiaoxiao2026-08-17  0

readLock()用于获得读锁,readUnlock()释放读锁,writeLock()和writeUnlock()一样。由于锁用完必须释放,因此,必须保证lock和unlock匹配。我们修改DataHandler,加入ReadWriteLock: package com.crackj2ee.thread; public class DataHandler { // store data: private char[] buffer = "AAAAAAAAAA".toCharArray(); // lock: private ReadWriteLock lock = new ReadWriteLock(); public char[] read(String name) throws InterruptedException { System.out.println(name + " waiting for read..."); lock.readLock(); try { char[] data = doRead(); System.out.println(name + " reads data: " + new String(data)); return data; } finally { lock.readUnlock(); } } public void write(String name, char[] data) throws InterruptedException { System.out.println(name + " waiting for write..."); lock.writeLock(); try { System.out.println(name + " wrote data: " + new String(data)); doWrite(data); } finally { lock.writeUnlock(); } } private char[] doRead() { char[] ret = new char[buffer.length]; for(int i=0; i<buffer.length; 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.length; i++) { buffer[i] = data[i]; sleep(10); } } } private void sleep(int ms) { try { Thread.sleep(ms); } catch(InterruptedException ie) {} } } public方法read()和write()完全封装了底层的ReadWriteLock,因此,多线程可以安全地调用这两个方法: // ReadingThread不断读取数据: package com.crackj2ee.thread; public class ReadingThread extends Thread { private DataHandler handler; public ReadingThread(DataHandler handler) { this.handler = handler; } public void run() { for(;;) { try { char[] data = handler.read(getName()); Thread.sleep((long)(Math.random()*1000+100)); } catch(InterruptedException ie) { break; } } } } // WritingThread不断写入数据,每次写入的都是10个相同的字符: package com.crackj2ee.thread; public class WritingThread extends Thread { private DataHandler handler; public WritingThread(DataHandler handler) { this.handler = handler; } public void run() { char[] data = new char[10]; for(;;) { try { fill(data); handler.write(getName(), data); Thread.sleep((long)(Math.random()*1000+100)); } catch(InterruptedException ie) { break; } } } // 产生一个A-Z随机字符,填入char[10]: private void fill(char[] data) { char c = (char)(Math.random()*26+'A'); for(int i=0; i<data.length; i++) data[i] = c; } }
转载请注明原文地址: https://www.6miu.com/read-5051365.html

最新回复(0)