`

java多线程编程——显示锁ReadWriteLock(二)

阅读更多
当需要对集合同时进行写入和读取操作时,如果多线程同时操作会出现异常,那么现在利用ReadWriteLock显示锁,可以在写入量比较小,读取量比较大的场景中,方便的实现上述功能。

package test;

import java.util.Calendar;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 可重入读写锁
 *
 * @author Administrator
 *
 */
@SuppressWarnings("all")
public class ReadWriteLockDemo {
	private ReentrantReadWriteLock lock = null;
	// 读锁
	private Lock readLock = null;
	// 写锁
	private Lock writeLock = null;
	public int key = 100;
	public int index = 100;
	// 线程共享数据
	public Map<Integer, String> dataMap = null;

	public ReadWriteLockDemo() {
		// 创建公平的可重入读写锁
		lock = new ReentrantReadWriteLock(true);
		readLock = lock.readLock();
		writeLock = lock.writeLock();
		dataMap = new TreeMap<Integer, String>();
	}

	public static void main(String[] args) {
		ReadWriteLockDemo test = new ReadWriteLockDemo();
		// 第一次获取写入锁
		test.writeLock.lock();
		System.out.println("线程" + Thread.currentThread().getName() + "第一次获取写入锁");
		// 第二次获取写入锁(这就是可重入的含义)
		test.writeLock.lock();
		System.out.println("线程" + Thread.currentThread().getName() + "第二次获取写入锁");

		test.readLock.lock();
		System.out.println("线程" + Thread.currentThread().getName() + "第一次获取读取锁");

		test.readLock.lock();
		System.out.println("线程" + Thread.currentThread().getName() + "第二次获取读取锁");

		test.readLock.lock();
		System.out.println("线程" + Thread.currentThread().getName() + "第三次获取读取锁");

		test.writeLock.unlock();
		test.writeLock.unlock();
		test.readLock.unlock();
		test.readLock.unlock();
		test.readLock.unlock();

		test.test();

	}

	public void test() {
		for (int i = 0; i < 10; i++) {
			new Thread(new reader(this)).start();
		}
		for (int i = 0; i < 3; i++) {
			new Thread(new writer(this)).start();
		}
	}

	public void read() {
		readLock.lock();
		try {
			if (dataMap.isEmpty()) {
				Calendar now = Calendar.getInstance();
				System.out.println("线程" + Thread.currentThread().getName() + "在" + now.getTime().getTime() + "读取数据,但是dataMap为空");
			}
			String value = dataMap.get(index);
			Calendar now = Calendar.getInstance();
			System.out.println("线程" + Thread.currentThread().getName() + "在" + now.getTime().getTime() + "读取数据,key=" + index + ",value=" + value + ",dataMap大小为" + dataMap.size());
			if (value != null) {
				index++;
			}
		} finally {
			readLock.unlock();
		}
		try {
			Thread.sleep(3000);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void write() {
		writeLock.lock();
		try {
			String value = "value" + key;
			dataMap.put(new Integer(key), value);
			Calendar now = Calendar.getInstance();
			System.out.println("线程" + Thread.currentThread().getName() + "在" + now.getTime().getTime() + "写入数据,key=" + key + ",value=" + value + ",dataMap大小为" + dataMap.size());
			key++;
			try {
				Thread.sleep(500);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} finally {
			writeLock.unlock();
		}
	}

	class reader implements Runnable {
		private ReadWriteLockDemo test = null;

		public reader(ReadWriteLockDemo test) {
			this.test = test;
		}

		@Override
		public void run() {
			Calendar now = Calendar.getInstance();
			System.out.println("读取线程" + Thread.currentThread().getName() + "在" + now.getTime().getTime() + "开始执行");
			for (int i = 0; i < 10; i++) {
				test.read();
			}
		}
	}

	class writer implements Runnable {
		private ReadWriteLockDemo test = null;

		public writer(ReadWriteLockDemo test) {
			this.test = test;
		}

		@Override
		public void run() {
			Calendar now = Calendar.getInstance();
			System.out.println("写入线程" + Thread.currentThread().getName() + "在" + now.getTime().getTime() + "开始执行");
			for (int i = 0; i < 10; i++) {
				test.write();
			}
		}
	}
}


    线程main第一次获取写入锁
    线程main第二次获取写入锁
    线程main第一次获取读取锁
    线程main第二次获取读取锁
    线程main第三次获取读取锁
    读取线程Thread-2在1302257210194开始执行
    线程Thread-2在1302257210194读取数据,但是dataMap为空
    线程Thread-2在1302257210194读取数据,key=100,value=null,dataMap大小为0
    写入线程Thread-12在1302257210194开始执行
    写入线程Thread-11在1302257210194开始执行
    线程Thread-12在1302257210195写入数据,key=100,value=value100,dataMap大小为1
    读取线程Thread-4在1302257210195开始执行
    读取线程Thread-6在1302257210195开始执行
    读取线程Thread-8在1302257210195开始执行
    读取线程Thread-3在1302257210195开始执行
    读取线程Thread-1在1302257210195开始执行
    读取线程Thread-5在1302257210195开始执行
    读取线程Thread-7在1302257210195开始执行
    读取线程Thread-0在1302257210195开始执行
    读取线程Thread-9在1302257210195开始执行
    写入线程Thread-10在1302257210195开始执行
    线程Thread-11在1302257210695写入数据,key=101,value=value101,dataMap大小为2
    线程Thread-4在1302257211215读取数据,key=100,value=value100,dataMap大小为2
    线程Thread-6在1302257211215读取数据,key=101,value=value101,dataMap大小为2
    线程Thread-8在1302257211215读取数据,key=102,value=null,dataMap大小为2
    线程Thread-1在1302257211215读取数据,key=102,value=null,dataMap大小为2
    线程Thread-3在1302257211215读取数据,key=102,value=null,dataMap大小为2
    线程Thread-5在1302257211215读取数据,key=102,value=null,dataMap大小为2
    线程Thread-7在1302257211215读取数据,key=102,value=null,dataMap大小为2
    线程Thread-0在1302257211215读取数据,key=102,value=null,dataMap大小为2
    线程Thread-9在1302257211215读取数据,key=102,value=null,dataMap大小为2
    线程Thread-10在1302257211216写入数据,key=102,value=value102,dataMap大小为3
    线程Thread-12在1302257211743写入数据,key=103,value=value103,dataMap大小为4
    线程Thread-11在1302257212243写入数据,key=104,value=value104,dataMap大小为5
    线程Thread-10在1302257212743写入数据,key=105,value=value105,dataMap大小为6
    线程Thread-12在1302257213243写入数据,key=106,value=value106,dataMap大小为7
    线程Thread-11在1302257213744写入数据,key=107,value=value107,dataMap大小为8
    线程Thread-2在1302257214244读取数据,key=102,value=value102,dataMap大小为8
    线程Thread-10在1302257214244写入数据,key=108,value=value108,dataMap大小为9
    线程Thread-12在1302257214744写入数据,key=109,value=value109,dataMap大小为10
    线程Thread-1在1302257215244读取数据,key=103,value=value103,dataMap大小为10
    线程Thread-3在1302257215244读取数据,key=104,value=value104,dataMap大小为10
    线程Thread-5在1302257215244读取数据,key=105,value=value105,dataMap大小为10
    线程Thread-7在1302257215244读取数据,key=106,value=value106,dataMap大小为10
    线程Thread-4在1302257215244读取数据,key=106,value=value106,dataMap大小为10
    线程Thread-6在1302257215244读取数据,key=107,value=value107,dataMap大小为10
    线程Thread-8在1302257215244读取数据,key=108,value=value108,dataMap大小为10
    线程Thread-9在1302257215244读取数据,key=110,value=value109,dataMap大小为10
    线程Thread-0在1302257215244读取数据,key=111,value=null,dataMap大小为10
    线程Thread-11在1302257215245写入数据,key=110,value=value110,dataMap大小为11
    线程Thread-10在1302257215745写入数据,key=111,value=value111,dataMap大小为12
    线程Thread-12在1302257216245写入数据,key=112,value=value112,dataMap大小为13
    线程Thread-11在1302257216745写入数据,key=113,value=value113,dataMap大小为14
    线程Thread-10在1302257217245写入数据,key=114,value=value114,dataMap大小为15
    线程Thread-12在1302257217745写入数据,key=115,value=value115,dataMap大小为16
    线程Thread-2在1302257218245读取数据,key=111,value=value111,dataMap大小为16
    线程Thread-11在1302257218245写入数据,key=116,value=value116,dataMap大小为17
    线程Thread-10在1302257218745写入数据,key=117,value=value117,dataMap大小为18
    线程Thread-4在1302257219245读取数据,key=112,value=value112,dataMap大小为18
    线程Thread-8在1302257219245读取数据,key=112,value=value112,dataMap大小为18
    线程Thread-6在1302257219245读取数据,key=113,value=value112,dataMap大小为18
    线程Thread-1在1302257219245读取数据,key=115,value=value115,dataMap大小为18
    线程Thread-3在1302257219245读取数据,key=115,value=value115,dataMap大小为18
    线程Thread-5在1302257219245读取数据,key=117,value=value116,dataMap大小为18
    线程Thread-7在1302257219245读取数据,key=117,value=value117,dataMap大小为18
    线程Thread-9在1302257219245读取数据,key=119,value=null,dataMap大小为18
    线程Thread-0在1302257219245读取数据,key=119,value=null,dataMap大小为18
    线程Thread-12在1302257219246写入数据,key=118,value=value118,dataMap大小为19
    线程Thread-11在1302257219746写入数据,key=119,value=value119,dataMap大小为20
    线程Thread-10在1302257220246写入数据,key=120,value=value120,dataMap大小为21
    线程Thread-12在1302257220746写入数据,key=121,value=value121,dataMap大小为22
    线程Thread-11在1302257221246写入数据,key=122,value=value122,dataMap大小为23
    线程Thread-10在1302257221746写入数据,key=123,value=value123,dataMap大小为24
    线程Thread-2在1302257222246读取数据,key=119,value=value119,dataMap大小为24
    线程Thread-12在1302257222246写入数据,key=124,value=value124,dataMap大小为25
    线程Thread-11在1302257222746写入数据,key=125,value=value125,dataMap大小为26
    线程Thread-3在1302257223247读取数据,key=120,value=value120,dataMap大小为26
    线程Thread-7在1302257223247读取数据,key=121,value=value121,dataMap大小为26
    线程Thread-1在1302257223247读取数据,key=122,value=value122,dataMap大小为26
    线程Thread-5在1302257223247读取数据,key=123,value=value123,dataMap大小为26
    线程Thread-9在1302257223247读取数据,key=124,value=value124,dataMap大小为26
    线程Thread-4在1302257223247读取数据,key=124,value=value124,dataMap大小为26
    线程Thread-8在1302257223247读取数据,key=126,value=value125,dataMap大小为26
    线程Thread-6在1302257223247读取数据,key=127,value=null,dataMap大小为26
    线程Thread-0在1302257223247读取数据,key=127,value=null,dataMap大小为26
    线程Thread-10在1302257223248写入数据,key=126,value=value126,dataMap大小为27
    线程Thread-12在1302257223748写入数据,key=127,value=value127,dataMap大小为28
    线程Thread-11在1302257224288写入数据,key=128,value=value128,dataMap大小为29
    线程Thread-10在1302257224788写入数据,key=129,value=value129,dataMap大小为30
    线程Thread-2在1302257225288读取数据,key=127,value=value127,dataMap大小为30
    线程Thread-3在1302257226247读取数据,key=128,value=value128,dataMap大小为30
    线程Thread-7在1302257226247读取数据,key=129,value=value129,dataMap大小为30
    线程Thread-1在1302257226247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-5在1302257226247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-9在1302257226247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-8在1302257226247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-4在1302257226247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-6在1302257226247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-0在1302257226248读取数据,key=130,value=null,dataMap大小为30
    线程Thread-2在1302257228288读取数据,key=130,value=null,dataMap大小为30
    线程Thread-3在1302257229247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-7在1302257229247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-1在1302257229247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-8在1302257229247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-4在1302257229247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-5在1302257229247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-9在1302257229247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-6在1302257229248读取数据,key=130,value=null,dataMap大小为30
    线程Thread-0在1302257229248读取数据,key=130,value=null,dataMap大小为30
    线程Thread-2在1302257231288读取数据,key=130,value=null,dataMap大小为30
    线程Thread-3在1302257232247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-7在1302257232247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-1在1302257232247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-5在1302257232247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-9在1302257232247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-8在1302257232247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-4在1302257232248读取数据,key=130,value=null,dataMap大小为30
    线程Thread-6在1302257232248读取数据,key=130,value=null,dataMap大小为30
    线程Thread-0在1302257232248读取数据,key=130,value=null,dataMap大小为30
    线程Thread-2在1302257234288读取数据,key=130,value=null,dataMap大小为30
    线程Thread-3在1302257235247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-8在1302257235247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-7在1302257235247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-1在1302257235247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-5在1302257235247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-9在1302257235247读取数据,key=130,value=null,dataMap大小为30
    线程Thread-4在1302257235248读取数据,key=130,value=null,dataMap大小为30
    线程Thread-6在1302257235248读取数据,key=130,value=null,dataMap大小为30
    线程Thread-0在1302257235248读取数据,key=130,value=null,dataMap大小为30
    线程Thread-2在1302257237289读取数据,key=130,value=null,dataMap大小为30
    线程Thread-8在1302257238261读取数据,key=130,value=null,dataMap大小为30
    线程Thread-6在1302257238261读取数据,key=130,value=null,dataMap大小为30
    线程Thread-0在1302257238261读取数据,key=130,value=null,dataMap大小为30
    线程Thread-4在1302257238261读取数据,key=130,value=null,dataMap大小为30
    线程Thread-3在1302257238268读取数据,key=130,value=null,dataMap大小为30
    线程Thread-7在1302257238268读取数据,key=130,value=null,dataMap大小为30
    线程Thread-1在1302257238268读取数据,key=130,value=null,dataMap大小为30
    线程Thread-5在1302257238268读取数据,key=130,value=null,dataMap大小为30
    线程Thread-9在1302257238268读取数据,key=130,value=null,dataMap大小为30
    线程Thread-2在1302257240307读取数据,key=130,value=null,dataMap大小为30
    线程Thread-8在1302257241279读取数据,key=130,value=null,dataMap大小为30
    线程Thread-6在1302257241279读取数据,key=130,value=null,dataMap大小为30
    线程Thread-0在1302257241279读取数据,key=130,value=null,dataMap大小为30
    线程Thread-4在1302257241279读取数据,key=130,value=null,dataMap大小为30
    线程Thread-3在1302257241291读取数据,key=130,value=null,dataMap大小为30
    线程Thread-7在1302257241291读取数据,key=130,value=null,dataMap大小为30
    线程Thread-1在1302257241291读取数据,key=130,value=null,dataMap大小为30
    线程Thread-5在1302257241291读取数据,key=130,value=null,dataMap大小为30
    线程Thread-9在1302257241291读取数据,key=130,value=null,dataMap大小为30


分享到:
评论

相关推荐

    Java多线程编程之读写锁ReadWriteLock用法实例

    主要介绍了Java多线程编程之读写锁ReadWriteLock用法实例,本文直接给出编码实例,需要的朋友可以参考下

    2-ReadWriteLock - Java多线程编程 - 飞扬学院.zip_d_fencebph

    飞扬学院的JAVA学习资料,有需要的的朋友可以下载学习。

    Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁

    主要介绍了Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁,本文讲解了ReentrantLock概况、Lock接口、Lock使用、轮询锁的和定时锁、公平性、可中断获锁获取操作等内容,需要的朋友可以参考下

    详解Java多线程编程中CountDownLatch阻塞线程的方法

    在Java中和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁",这里我们就来详解Java多线程编程中CountDownLatch阻塞线程的方法:

    Java多线程之readwritelock读写分离的实现代码

    主要介绍了Java多线程之readwritelock读写分离的相关内容,文中涉及具体实例代码,具有一定参考价值,需要的朋友可以了解下。

    详解java多线程的同步控制

    目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ReadWriteLock倒计数器 CountDownLatch循环栅栏 CyclicBarrier信号量 Semaphore 线程安全 Thread Safety JMM JMM(Java Memory Model)是一种基于计算机内存...

    同步 读写锁 readwriteLock

    读写锁的设计实现等.。。。。。。。。。。。。。。。。。。。。

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段16讲、多线程读写锁分离设计模式讲解-上.mp4 │ 高并发编程第二阶段17讲、多线程读写锁分离设计模式讲解-中.mp4 │ 高并发编程第二阶段18讲、多线程读写锁分离设计模式讲解-下.mp4 │ 高...

    java并发编程-AQS和JUC实战

    果同⼀个线程多次获锁,那么在释放锁的时候,也必须释放相同次数。如果释放锁的次数多,那么 会得到⼀个java.lang.IllegalMonitorStateException异常,反之,如果释放锁的次数少,那么相当 于线程还持有这个锁

    23 按需上锁—ReadWriteLock详解.pdf

    Java并发编程学习宝典(漫画版),Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习...

    NET多线程同步方法详解

    .NET多线程同步方法详解(一):自由锁(InterLocked) 本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再赘述了。直接接入主题,在多线程开发的应用中,线程同步是不可避免的。在.Net框架中,...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段16讲、多线程读写锁分离设计模式讲解-上.mp4 │ 高并发编程第二阶段17讲、多线程读写锁分离设计模式讲解-中.mp4 │ 高并发编程第二阶段18讲、多线程读写锁分离设计模式讲解-下.mp4 │ 高...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    java_util_concurrent_user_guide_cn.pdf 内容预览: ...21. 读写锁 ReadWriteLock 22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    java_util_concurrent_user_guide_cn.pdf 内容预览: 1.... 读写锁 ReadWriteLock 22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReferenc

    java并发工具包详解

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    ReadWriteLock的使用

    ReadWriteLock的使用,实际上由于ReadWriteLock是一个接口,所以实际使用的是ReentrantReadWriteLock子类。同时ReadWriteLock的使用其实也是比较简单的,就是读写的锁的使用以及注意事项而已。

    e语言-易语言线程安全之原子锁与读写锁

    局部变量 rwLock, ReadWriteLock ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、...

    尚硅谷Java视频_JUC 视频教程

    尚硅谷_JUC线程高级_ReadWriteLock 读写锁 ·12. 尚硅谷_JUC线程高级_线程八锁 ·13. 尚硅谷_JUC线程高级_线程池 ·14. 尚硅谷_JUC线程高级_线程调度 ·15. ForkJoinPool 分支合并框架-工作窃取

    C#实现多线程的同步方法实例分析

    本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就...3. 读写锁(ReadWriteLock) 4. 系统内核对象 1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent) 2) 线程池 除了以上

    ReadWriteLock

    一个Windows下C++读写锁的代码,实现共享读,独占写

Global site tag (gtag.js) - Google Analytics