本文研究的主要是ReadWriteLock特性,具体如下。
readLock 与 readLock 不互斥
readLock 与 writeLock 互斥
writeLock 与 readLock 互斥
writeLock 与 writeLock 互斥
线程1, 先拿到readLock, 线程2试图拿readLock, 可以拿到
线程1, 先拿到readLock, 线程2试图拿writeLock, 阻塞等待,直到线程1释放锁之后才可以拿到
线程1, 先拿到writeLock,线程2试图拿readLock, 阻塞等待,直到线程1释放锁之后才可以拿到
线程1, 先拿到writeLock,线程2试图拿writeLock, 阻塞等待,直到线程1释放锁之后才可以拿到
package com.alioo.lock; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * */ public class ReadWriteLockDemo { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); public static void main(String[] args) { Data data = new Data(); Worker t1 = new Worker(data, false); //写 Worker t2 = new Worker(data, true); //读 Worker t3 = new Worker(data, true); //读 t1.start(); t2.start(); t3.start(); } static class Worker extends Thread { Data data; Boolean read; public Worker(Data data, Boolean read) { this.data = data; this.read = read; } public void run() { if (read) data.read(); else data.write(); } } static class Data { ReadWriteLock lock = new ReentrantReadWriteLock(); Lock read = lock.readLock(); Lock write = lock.writeLock(); public void write() { try { Thread.sleep(2000); // } catch (Exception e) { } write.lock(); System.out.println(Thread.currentThread() + " write:begin " + sdf.format(new Date())); try { Thread.sleep(5000); // } catch (Exception e) { } finally { System.out.println(Thread.currentThread() + " write:end " + sdf.format(new Date())); write.unlock(); } } public int read() { read.lock(); System.out.println(Thread.currentThread()+ " read :begin " + sdf.format(new Date())); try { Thread.sleep(5000); // } catch (Exception e) { } finally { System.out.println(Thread.currentThread() + " read :end " + sdf.format(new Date())); read.unlock(); } return 1; } } }
Thread[Thread-2,5,main] read :begin 2018-01-22 13:54:16.794
Thread[Thread-1,5,main] read :begin 2018-01-22 13:54:16.794
Thread[Thread-2,5,main] read :end 2018-01-22 13:54:21.795
Thread[Thread-1,5,main] read :end 2018-01-22 13:54:21.795
Thread[Thread-0,5,main] write:begin 2018-01-22 13:54:21.795
Thread[Thread-0,5,main] write:end 2018-01-22 13:54:26.795
同时启动了3个线程,其中1号线程Thread[Thread-0,5,main],执行write时先休眠了2秒.那么 2,3号线程Thread[Thread-1,5,main],Thread[Thread-2,5,main]将会优先执行代码
read.lock();
由于read.lock();是不互斥的(即可重入的),所以他们同时拿到了锁,通过日志可以看出来
Thread[Thread-2,5,main] read :begin 2018-01-22 13:54:16.794 Thread[Thread-1,5,main] read :begin 2018-01-22 13:54:16.794
而且他们执行的时间开销是相同的(测试代码中都是休眠5秒),所以也将同时执行结束
Thread[Thread-2,5,main] read :end 2018-01-22 13:54:21.795 Thread[Thread-1,5,main] read :end 2018-01-22 13:54:21.795
只有当所有的readLock被释放掉之后,writeLock才能拿到锁,而这个时候Thread[Thread-1,5,main],Thread[Thread-2,5,main]执行结束后就会释放锁readLock
所以Thread[Thread-0,5,main]这个时候拿到了writeLock并执行自己的业务代码
Thread[Thread-0,5,main] write:begin 2018-01-22 13:54:21.795 Thread[Thread-0,5,main] write:end 2018-01-22 13:54:26.795
以上就是本文关于Java语言ReadWriteLock特性实例测试的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
1 Python的函数参数传递 看两个例子: a = 1 def fun(a): a = 2 fun(a) print a # 1 a = [] def fun(a): a.append(1) fun(a) print a # [1] 所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。 通过id来看引用a的内存地址可以比较理解: a = 1
主要内容:语法简单,并发模型,内存分配,垃圾回收,静态链接,标准库,工具链Go语言也称为 Golang,是由 Google 公司开发的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。 接下来从几个方面来具体介绍一下Go语言的特性。 语法简单 抛开语法样式不谈,单就类型和规则而言,Go 与 C99、C11 相似之处颇多,这也是Go语言被冠以“NextC”名号的重要原因。 Go语言的语法处于简单和复杂的两极。C语言简单到你每写下一行代码,都能在脑中想象出编译后
介绍 语言特性,即lang包,主要针对JDK中的一些数据结构和接口的完善,包括: caller 获取方法调用者 copier 复制器抽象接口 func 函数接口 hash 哈希算法 loader 加载器抽象接口 mutable 提供可变对象 tree 提供树状结构 其它 总之,lang包下提供了一个大杂烩,汇集了各种数据结构。
java.util.concurrent.locks.ReadWriteLock接口允许多个线程一次读取,但一次只能写入一个线程。 Read Lock - 如果没有线程锁定ReadWriteLock进行写入,则多个线程可以访问读锁定。 Write Lock - 如果没有线程在读或写,则一个线程可以访问写锁定。 锁定方法 以下是Lock类中可用的重要方法列表。 Sr.No. 方法和描述 1 publ
本文向大家介绍Ruby的语法和语言特性总结,包括了Ruby的语法和语言特性总结的使用技巧和注意事项,需要的朋友参考一下 Ruby是一种解释型、面向对象、动态类型的语言。Ruby采取的策略是在灵活性和运行时安全之间寻找平衡点。随着Rails框架的出现,Ruby也在2006年前后一鸣惊人,同时也指引人们重新找回编程乐趣。尽管从执行速度上说,Ruby谈不上有多高效,但它却能让程序员的编程效率大幅提高。本
本文向大家介绍JS的语言特性有哪些?相关面试题,主要包含被问及JS的语言特性有哪些?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 运行在客户端浏览器上; 不用预编译,直接解析执行代码; 是弱类型语言,较为灵活; 与操作系统无关,跨平台的语言; 脚本语言、解释性语言