1、公平选择性,支持非公平和公平锁获取,吞吐量不公平优于公平。
2、重进入,读锁和写锁都支持线程重进入。
3、锁降级,遵循获取写锁、获取读锁、释放写锁的顺序,写锁可以降级为读锁。
实例
public class readwritelocktest { public static void main(string[] args) { final queue q = new queue(); for (int i = 0; i < 3; i++) { new thread() { @override public void run() { while (true) { q.get(); } } }.start(); new thread() { @override public void run() { while (true) { q.put(new random().nextint(10000)); } } }.start(); } }} class queue { //共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。 readwritelock rwl = new reentrantreadwritelock(); private object data = null;//共享数据,只能有一个线程能写数据,但可以有多个线程读该数据 public void get() { //上读锁,其他线程只能读不能写 rwl.readlock().lock(); try { system.out.println(thread.currentthread().getname() + be ready to read data!); thread.sleep((long) (math.random() * 1000)); system.out.println(thread.currentthread().getname() + have read data : + data); } catch (interruptedexception e) { e.printstacktrace(); } finally { rwl.readlock().unlock(); } } public void put(object data) { //上写锁,不允许其他线程读也不允许写 rwl.writelock().lock(); try { system.out.println(thread.currentthread().getname() + be ready to write data!); thread.sleep((long) (math.random() * 1000)); this.data = data; system.out.println(thread.currentthread().getname() + have write data: + data); } catch (interruptedexception e) { e.printstacktrace(); } finally { rwl.writelock().unlock(); } }}
以上就是java读写锁怎么用的详细内容。
