博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3.1.4 读写锁
阅读量:5214 次
发布时间:2019-06-14

本文共 3225 字,大约阅读时间需要 10 分钟。

一、分为两种:公平和非公平 线程 a b c d e 公平:按顺序执行:a,b,d,e 读锁 c 写锁       1.a,b 执行 c 堵塞,d,e 等待       2.a,b执行结束 c获取锁 d,e堵塞等待       3.c执行结束 d开始执行,然后在唤醒e 非公平:       1,2步骤相同       3,c执行结束的时候,新来个线程 f读锁,在d没有唤醒的情况下,会获取读锁,然后在唤醒d,e
package 第三章.读写锁; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.ReentrantReadWriteLock; /**  * Created by zzq on 2018/1/23.  */ public class WebTestReadAndWriteLock {
ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public static void main(String[] args) {
final WebTestReadAndWriteLock lock = new WebTestReadAndWriteLock(); // 建N个线程,同时读 ExecutorService service = Executors.newCachedThreadPool(); service.execute(new Runnable() {
public void run() {
lock.readFile(Thread.currentThread()); } }); service.execute(new Runnable() {
public void run() {
lock.readFile(Thread.currentThread()); } }); // 建N个线程,同时写 ExecutorService service1 = Executors.newCachedThreadPool(); service1.execute(new Runnable() {
public void run() {
lock.writeFile(Thread.currentThread()); } }); service.execute(new Runnable() {
public void run() {
lock.readFile(Thread.currentThread()); } }); service.execute(new Runnable() {
public void run() {
lock.readFile(Thread.currentThread()); } }); service1.execute(new Runnable() {
public void run() {
lock.writeFile(Thread.currentThread()); } }); } // 读操作 public void readFile(Thread thread){
lock.readLock().lock(); boolean readLock = lock.isWriteLocked(); if(!readLock){
System.out.println("当前为读锁!"); } try{
for(int i=0; i<5; i++){
try {
Thread.sleep(1000); } catch (InterruptedException e) {
e.printStackTrace(); } System.out.println(thread.getName() + ":正在进行读操作……"); } System.out.println(thread.getName() + ":读操作完毕!"); }finally{
System.out.println("释放读锁!"); lock.readLock().unlock(); } } // 写操作 public void writeFile(Thread thread){
lock.writeLock().lock(); boolean writeLock = lock.isWriteLocked(); if(writeLock){
System.out.println("当前为写锁!"); } try{
for(int i=0; i<5; i++){
try {
Thread.sleep(1000); } catch (InterruptedException e) {
e.printStackTrace(); } System.out.println(thread.getName() + ":正在进行写操作……"); } System.out.println(thread.getName() + ":写操作完毕!"); }finally{
System.out.println("释放写锁!"); lock.writeLock().unlock(); } } }

转载于:https://www.cnblogs.com/anxbb/p/8425537.html

你可能感兴趣的文章
创建Oracle synonym 详解
查看>>
php7 新特性整理
查看>>
RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
linux查看端口占用
查看>>
hdu - 1226 超级密码 (bfs)
查看>>
Qt重写paintEvent方法遇到的问题
查看>>
Sql常见面试题 受用了
查看>>
知识不是来炫耀的,而是来分享的-----现在的人们却…似乎开始变味了…
查看>>
CSS背景颜色、背景图片、平铺、定位、固定
查看>>
口胡:[HNOI2011]数学作业
查看>>
我的第一个python web开发框架(29)——定制ORM(五)
查看>>
Combination Sum III -- leetcode
查看>>
中国剩余定理
查看>>
基础笔记一
查看>>
uva 10137 The trip
查看>>
spring 解决中文乱码问题
查看>>
hdu 4268
查看>>
启动tomcat时cmd窗口一闪而过
查看>>
两个有序数列,求中间值 Median of Two Sorted Arrays
查看>>
vue路由的实现原理
查看>>