- 浏览: 91267 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
jinnianshilongnian:
TheMatrix 写道CL0724 写道xiaobadi 写 ...
spring3配置文件中的<context:property-placeholder>标签 -
TheMatrix:
CL0724 写道xiaobadi 写道:<contex ...
spring3配置文件中的<context:property-placeholder>标签 -
hovei:
[b][/b][i][/i][u][/u]引用
[img][ ...
安全测试 关于会话标识未更新的解决方法 -
CL0724:
xiaobadi 写道:<context:propert ...
spring3配置文件中的<context:property-placeholder>标签 -
xiaobadi:
:<context:property-placehold ...
spring3配置文件中的<context:property-placeholder>标签
1业务要求:
消息中间件kafka即时发送消息对象,storm即时处理,数据入库频率五分钟一次;
2:开发思路
在每个jvm中使用单例对象,添加读写锁(java.util.concurrent.locks.ReentrantReadWriteLock)对象的使用,线程安全队列(java.util.concurrent.LinkedBlockingQueue<String>)对象,利用锁的特性来控制队列读写操作,达到读数据的时候 写操作堵塞。
下面贴上测试代码实现:
测试类
运行结果:
Thread-1写入数据:Thread-1-[1]
Thread-2写入数据:Thread-2-[1]
Thread-3写入数据:Thread-3-[1]
Thread-1写入数据:Thread-1-[2]
Thread-2写入数据:Thread-2-[2]
Thread-3写入数据:Thread-3-[2]
Thread-1写入数据:Thread-1-[3]
Thread-2写入数据:Thread-2-[3]
Thread-3写入数据:Thread-3-[3]
Thread-3写入数据:Thread-3-[4]
Thread-1写入数据:Thread-1-[4]
Thread-2写入数据:Thread-2-[4]
Thread-3写入数据:Thread-3-[5]
Thread-3写入数据:Thread-3-[6]
Thread-2写入数据:Thread-2-[5]
Thread-3写入数据:Thread-3-[7]
Thread-1写入数据:Thread-1-[5]
Thread-2写入数据:Thread-2-[6]
Thread-3写入数据:Thread-3-[8]
Thread-2写入数据:Thread-2-[7]
Thread-1写入数据:Thread-1-[6]
Thread-3写入数据:Thread-3-[9]
Thread-3写入数据:Thread-3-[10]
Thread-1写入数据:Thread-1-[7]
Thread-2写入数据:Thread-2-[8]
Thread-3写入数据:Thread-3-[11]
Thread-2写入数据:Thread-2-[9]
Thread-2写入数据:Thread-2-[10]
Thread-1写入数据:Thread-1-[8]
Thread-3写入数据:Thread-3-[12]
Thread-2写入数据:Thread-2-[11]
Thread-3写入数据:Thread-3-[13]
Thread-1写入数据:Thread-1-[9]
Thread-1写入数据:Thread-1-[10]
Thread-1写入数据:Thread-1-[11]
Thread-2写入数据:Thread-2-[12]
Thread-3写入数据:Thread-3-[14]
Thread-1写入数据:Thread-1-[12]
Thread-1写入数据:Thread-1-[13]
Thread-1写入数据:Thread-1-[14]
Thread-2写入数据:Thread-2-[13]
Thread-3写入数据:Thread-3-[15]
Thread-1写入数据:Thread-1-[15]
Thread-2写入数据:Thread-2-[14]
Thread-3写入数据:Thread-3-[16]
Thread-1写入数据:Thread-1-[16]
Thread-3写入数据:Thread-3-[17]
Thread-3写入数据:Thread-3-[18]
Thread-2写入数据:Thread-2-[15]
Thread-2写入数据:Thread-2-[16]
Thread-2写入数据:Thread-2-[17]
Thread-1写入数据:Thread-1-[17]
Thread-1写入数据:Thread-1-[18]
Thread-3写入数据:Thread-3-[19]
Thread-2写入数据:Thread-2-[18]
Thread-1写入数据:Thread-1-[19]
Thread-3写入数据:Thread-3-[20]
Thread-2写入数据:Thread-2-[19]
Thread-1写入数据:Thread-1-[20]
Thread-2写入数据:Thread-2-[20]
Thread-4读取数据:Thread-1-[1]
Thread-4读取数据:Thread-2-[1]
Thread-4读取数据:Thread-3-[1]
Thread-4读取数据:Thread-1-[2]
Thread-4读取数据:Thread-2-[2]
Thread-4读取数据:Thread-3-[2]
Thread-4读取数据:Thread-1-[3]
Thread-4读取数据:Thread-2-[3]
Thread-4读取数据:Thread-3-[3]
Thread-4读取数据:Thread-3-[4]
Thread-4读取数据:Thread-1-[4]
Thread-4读取数据:Thread-2-[4]
Thread-4读取数据:Thread-3-[5]
Thread-4读取数据:Thread-3-[6]
Thread-4读取数据:Thread-2-[5]
Thread-4读取数据:Thread-3-[7]
Thread-4读取数据:Thread-1-[5]
Thread-4读取数据:Thread-2-[6]
Thread-4读取数据:Thread-3-[8]
Thread-4读取数据:Thread-2-[7]
Thread-4读取数据:Thread-1-[6]
Thread-4读取数据:Thread-3-[9]
Thread-4读取数据:Thread-3-[10]
Thread-4读取数据:Thread-1-[7]
Thread-4读取数据:Thread-2-[8]
Thread-4读取数据:Thread-3-[11]
Thread-4读取数据:Thread-2-[9]
Thread-4读取数据:Thread-2-[10]
Thread-4读取数据:Thread-1-[8]
Thread-4读取数据:Thread-3-[12]
Thread-4读取数据:Thread-2-[11]
Thread-4读取数据:Thread-3-[13]
Thread-4读取数据:Thread-1-[9]
Thread-4读取数据:Thread-1-[10]
Thread-4读取数据:Thread-1-[11]
Thread-4读取数据:Thread-2-[12]
Thread-4读取数据:Thread-3-[14]
Thread-4读取数据:Thread-1-[12]
Thread-4读取数据:Thread-1-[13]
Thread-4读取数据:Thread-1-[14]
Thread-4读取数据:Thread-2-[13]
Thread-4读取数据:Thread-3-[15]
Thread-4读取数据:Thread-1-[15]
Thread-4读取数据:Thread-2-[14]
Thread-4读取数据:Thread-3-[16]
Thread-4读取数据:Thread-1-[16]
Thread-4读取数据:Thread-3-[17]
Thread-4读取数据:Thread-3-[18]
Thread-4读取数据:Thread-2-[15]
Thread-4读取数据:Thread-2-[16]
Thread-4读取数据:Thread-2-[17]
Thread-4读取数据:Thread-1-[17]
Thread-4读取数据:Thread-1-[18]
Thread-4读取数据:Thread-3-[19]
Thread-4读取数据:Thread-2-[18]
Thread-4读取数据:Thread-1-[19]
Thread-4读取数据:Thread-3-[20]
Thread-4读取数据:Thread-2-[19]
Thread-4读取数据:Thread-1-[20]
Thread-4读取数据:Thread-2-[20]
把写入数据和读取数据对比之后发现,写入的顺序和读取的顺序是一致的,所以测试通过
消息中间件kafka即时发送消息对象,storm即时处理,数据入库频率五分钟一次;
2:开发思路
在每个jvm中使用单例对象,添加读写锁(java.util.concurrent.locks.ReentrantReadWriteLock)对象的使用,线程安全队列(java.util.concurrent.LinkedBlockingQueue<String>)对象,利用锁的特性来控制队列读写操作,达到读数据的时候 写操作堵塞。
下面贴上测试代码实现:
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @author liqiankun * */ public class BlockQueue { private LinkedBlockingQueue<String> blockingQueue = new LinkedBlockingQueue<String>(); private ReadWriteLock rwl = new ReentrantReadWriteLock(); private static final BlockQueue QUEUE = new BlockQueue(); private BlockQueue() { } public static BlockQueue getQueue(){ return QUEUE; } public void putData(String s){ rwl.writeLock().lock();//取到写锁 try { blockingQueue.offer(s); System.out.println(Thread.currentThread().getName() + "写入数据:" + s); }catch (Exception e) { } finally { rwl.writeLock().unlock();// 释放写锁 } } public void execute(){ new Thread(){ @Override public void run() { while(true){ try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } rwl.readLock().lock(); try { //启动一个线程去处理数据,保证不影响下一次数据的读取操作 new Thread(){ private LinkedBlockingQueue<String> tempBlockingQueue = new LinkedBlockingQueue<String>(); { //将blockingQueue的数据引用赋值给tempBlockingQueue tempBlockingQueue = blockingQueue; //将blockingQueue重新new出一个对象。 blockingQueue = new LinkedBlockingQueue<String>(); } @Override public void run() { while(!tempBlockingQueue.isEmpty()){ String s = tempBlockingQueue.poll();// System.out.println(Thread.currentThread().getName()+"读取数据:"+s); } } }.start(); } catch (Exception e) { e.printStackTrace(); }finally{ rwl.readLock().unlock(); } } } }.start(); } }
测试类
import java.util.Random; import java.util.concurrent.LinkedBlockingQueue; /** * @author liqiankun * */ public class TestLock { private LinkedBlockingQueue<String> tempBlockingQueue = new LinkedBlockingQueue<String>(); private LinkedBlockingQueue<String> blockingQueue = new LinkedBlockingQueue<String>(); private static String[] str= {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"}; public static void main(String[] args) { BlockQueue blockQueue = BlockQueue.getQueue(); blockQueue.execute(); //while(true){ for(int i=0;i<3;i++){ new Thread(){ @Override public void run() { for(int j=0;j<20;j++){ BlockQueue.getQueue().putData(Thread.currentThread().getName()+"-["+str[j]+"]"); try { Thread.sleep(new Random().nextInt(100)); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } try { Thread.sleep(new Random().nextInt(2000)); } catch (InterruptedException e) { e.printStackTrace(); } //} /*TestLock t = new TestLock(); t.blockingQueue.offer("1"); t.blockingQueue.offer("2"); t.blockingQueue.offer("3"); t.tempBlockingQueue = t.blockingQueue; t.blockingQueue = new LinkedBlockingQueue<String>(); System.out.println("--new 对象之后--------"); while(!t.blockingQueue.isEmpty()){ System.out.println(t.blockingQueue.poll()); } System.out.println("-----------"); while(!t.tempBlockingQueue.isEmpty()){ System.out.println("tempBlockingQueue"+t.tempBlockingQueue.poll()); } System.out.println("-----------"); */ } }
运行结果:
Thread-1写入数据:Thread-1-[1]
Thread-2写入数据:Thread-2-[1]
Thread-3写入数据:Thread-3-[1]
Thread-1写入数据:Thread-1-[2]
Thread-2写入数据:Thread-2-[2]
Thread-3写入数据:Thread-3-[2]
Thread-1写入数据:Thread-1-[3]
Thread-2写入数据:Thread-2-[3]
Thread-3写入数据:Thread-3-[3]
Thread-3写入数据:Thread-3-[4]
Thread-1写入数据:Thread-1-[4]
Thread-2写入数据:Thread-2-[4]
Thread-3写入数据:Thread-3-[5]
Thread-3写入数据:Thread-3-[6]
Thread-2写入数据:Thread-2-[5]
Thread-3写入数据:Thread-3-[7]
Thread-1写入数据:Thread-1-[5]
Thread-2写入数据:Thread-2-[6]
Thread-3写入数据:Thread-3-[8]
Thread-2写入数据:Thread-2-[7]
Thread-1写入数据:Thread-1-[6]
Thread-3写入数据:Thread-3-[9]
Thread-3写入数据:Thread-3-[10]
Thread-1写入数据:Thread-1-[7]
Thread-2写入数据:Thread-2-[8]
Thread-3写入数据:Thread-3-[11]
Thread-2写入数据:Thread-2-[9]
Thread-2写入数据:Thread-2-[10]
Thread-1写入数据:Thread-1-[8]
Thread-3写入数据:Thread-3-[12]
Thread-2写入数据:Thread-2-[11]
Thread-3写入数据:Thread-3-[13]
Thread-1写入数据:Thread-1-[9]
Thread-1写入数据:Thread-1-[10]
Thread-1写入数据:Thread-1-[11]
Thread-2写入数据:Thread-2-[12]
Thread-3写入数据:Thread-3-[14]
Thread-1写入数据:Thread-1-[12]
Thread-1写入数据:Thread-1-[13]
Thread-1写入数据:Thread-1-[14]
Thread-2写入数据:Thread-2-[13]
Thread-3写入数据:Thread-3-[15]
Thread-1写入数据:Thread-1-[15]
Thread-2写入数据:Thread-2-[14]
Thread-3写入数据:Thread-3-[16]
Thread-1写入数据:Thread-1-[16]
Thread-3写入数据:Thread-3-[17]
Thread-3写入数据:Thread-3-[18]
Thread-2写入数据:Thread-2-[15]
Thread-2写入数据:Thread-2-[16]
Thread-2写入数据:Thread-2-[17]
Thread-1写入数据:Thread-1-[17]
Thread-1写入数据:Thread-1-[18]
Thread-3写入数据:Thread-3-[19]
Thread-2写入数据:Thread-2-[18]
Thread-1写入数据:Thread-1-[19]
Thread-3写入数据:Thread-3-[20]
Thread-2写入数据:Thread-2-[19]
Thread-1写入数据:Thread-1-[20]
Thread-2写入数据:Thread-2-[20]
Thread-4读取数据:Thread-1-[1]
Thread-4读取数据:Thread-2-[1]
Thread-4读取数据:Thread-3-[1]
Thread-4读取数据:Thread-1-[2]
Thread-4读取数据:Thread-2-[2]
Thread-4读取数据:Thread-3-[2]
Thread-4读取数据:Thread-1-[3]
Thread-4读取数据:Thread-2-[3]
Thread-4读取数据:Thread-3-[3]
Thread-4读取数据:Thread-3-[4]
Thread-4读取数据:Thread-1-[4]
Thread-4读取数据:Thread-2-[4]
Thread-4读取数据:Thread-3-[5]
Thread-4读取数据:Thread-3-[6]
Thread-4读取数据:Thread-2-[5]
Thread-4读取数据:Thread-3-[7]
Thread-4读取数据:Thread-1-[5]
Thread-4读取数据:Thread-2-[6]
Thread-4读取数据:Thread-3-[8]
Thread-4读取数据:Thread-2-[7]
Thread-4读取数据:Thread-1-[6]
Thread-4读取数据:Thread-3-[9]
Thread-4读取数据:Thread-3-[10]
Thread-4读取数据:Thread-1-[7]
Thread-4读取数据:Thread-2-[8]
Thread-4读取数据:Thread-3-[11]
Thread-4读取数据:Thread-2-[9]
Thread-4读取数据:Thread-2-[10]
Thread-4读取数据:Thread-1-[8]
Thread-4读取数据:Thread-3-[12]
Thread-4读取数据:Thread-2-[11]
Thread-4读取数据:Thread-3-[13]
Thread-4读取数据:Thread-1-[9]
Thread-4读取数据:Thread-1-[10]
Thread-4读取数据:Thread-1-[11]
Thread-4读取数据:Thread-2-[12]
Thread-4读取数据:Thread-3-[14]
Thread-4读取数据:Thread-1-[12]
Thread-4读取数据:Thread-1-[13]
Thread-4读取数据:Thread-1-[14]
Thread-4读取数据:Thread-2-[13]
Thread-4读取数据:Thread-3-[15]
Thread-4读取数据:Thread-1-[15]
Thread-4读取数据:Thread-2-[14]
Thread-4读取数据:Thread-3-[16]
Thread-4读取数据:Thread-1-[16]
Thread-4读取数据:Thread-3-[17]
Thread-4读取数据:Thread-3-[18]
Thread-4读取数据:Thread-2-[15]
Thread-4读取数据:Thread-2-[16]
Thread-4读取数据:Thread-2-[17]
Thread-4读取数据:Thread-1-[17]
Thread-4读取数据:Thread-1-[18]
Thread-4读取数据:Thread-3-[19]
Thread-4读取数据:Thread-2-[18]
Thread-4读取数据:Thread-1-[19]
Thread-4读取数据:Thread-3-[20]
Thread-4读取数据:Thread-2-[19]
Thread-4读取数据:Thread-1-[20]
Thread-4读取数据:Thread-2-[20]
把写入数据和读取数据对比之后发现,写入的顺序和读取的顺序是一致的,所以测试通过
发表评论
-
注解式springMVC的demo
2015-09-14 20:13 1317项目中使用springmvc,使用注解标签,spring版本3 ... -
spring使用ldap
2015-09-14 13:42 1633为了读取公司域账号,使用上ldap接口,Java编码如下 ; ... -
ArrayList和LinkedList的区别
2014-10-20 15:20 668一般大家都知道ArrayList和LinkedList的大致区 ... -
java 中将以逗号分隔的字符串按照N个一组划分的方法
2013-10-29 23:38 6453import java.util.ArrayList; ... -
java反射demo
2013-05-25 00:53 829/** * */ package *; ... -
java中ArrayList和LinkedList的区别 转自http://pengcqu.iteye.com/blog/502676
2013-05-25 00:50 842JAVA语言中的反射机制: ... -
struts OGNL(转载)
2013-03-14 23:12 771Struts2使用之值栈与OGNL-使用 访问属性 ... -
java禁止不需要的HTTP 方 法
2012-10-30 19:03 2849项目安全扫描,报告: 启用了不安全的HTTP 方法 安全风险 ... -
安全测试 关于会话标识未更新的解决方法
2012-10-30 16:05 25248最近本人搭了一个框架 ... -
java关键字,native,strictfp,transient,volatile (转自http://blog.csdn.net/sodino)
2012-10-29 20:56 856Java关键字(keywords) ... -
Java中各类Cache机制实现解决方案(转自http://www.csdn.net/article/2010-04-09/263704)
2012-10-29 17:37 1177在Java中,不同的类都有自己单独的Cache机制,实现的方法 ... -
Java编程中“为了性能”需做的26件事(转自http://www.csdn.net/article/2012-06-01/2806249)
2012-10-29 17:18 771下面是参考网络资源总 ... -
一些我需要用的资料
2012-10-16 22:51 0flex在线参考资料http://help.adobe.com ... -
Log4j简介(转载自http://www.iteye.com/topic/165955)
2012-10-12 14:36 988Log4j的简介: Log4j是Apache的一个开放源代码 ... -
Log4j入门(转载自http://xuxn.iteye.com/blog/416380)
2012-10-12 14:34 959首先要将 log4j-1.2.8.jar & comm ... -
关于java数据连接池的一些配置(转载自http://qrqzhujinyi.iteye.com/blog/698279)
2012-10-11 14:43 878数据库连接池配置 概述 ... -
JAVA考试知识覆盖要点
2012-09-29 16:14 0JAVA考试知识覆盖要点: (1)常用的集合类,如Set、Ma ... -
Java1.5泛型指南中文版(Java1.5 Generic Tutorial)(转帖)
2012-09-25 10:08 690由于文章字数太多,附上地址吧http://blog.csdn. ... -
关于java泛型的学习
2012-10-09 18:47 1200java中我们经常用泛型的占位符,T E K V的含义 T = ... -
一个生成验证码的类
2012-09-24 11:08 1061package com.huawei.tsm.business ...
相关推荐
读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁...
6.JUC并发工具类在大厂的应用场景详解 (1).pdf ...8、读写锁ReentrantReadWriteLock&StampLock详解.pdf 9、并发容器 (Map、List、Set) 实战及其原理.pdf 10、阻塞队列BlockingQueue 实战及其原理分析.pdf
主要介绍了举例说明Java多线程编程中读写锁的使用,文中的例子很好地说明了Java的自带读写锁ReentrantReadWriteLock的使用,需要的朋友可以参考下
主要介绍了Java多线程 ReentrantReadWriteLock原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java 多线程与并发(12_26)-JUC锁_ ReentrantReadWriteLock详解
针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它表示两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁 类图如下: 说明:如上图所示Sync为ReentrantReadWriteLock...
ReentrantLock//互斥锁 class CachedData { Object data; volatile boolean cacheValid; ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
本篇文章主要介绍了Java concurrency之共享锁和ReentrantReadWriteLock,非常具有实用价值,需要的朋友可以参考下
6.JUC并发工具类在大厂的应用场景详解 (1).pdf ...8、读写锁ReentrantReadWriteLock&StampLock详解.pdf 9、并发容器 (Map、List、Set) 实战及其原理.pdf 10、阻塞队列BlockingQueue 实战及其原理分析.pdf
11.深入理解读写锁ReentrantReadWriteLock 12.详解Condition的await和signal等待通知机制 13.LockSupport工具 14.并发容器之ConcurrentHashMap(JDK 1.8版本) 15.并发容器之ConcurrentLinkedQueue 16.并发容器之...
ReentrantReadWriteLock 读写锁除了保证写操作对读操作可见性以及并发行提升外,简化了读写交互场景开发
6.JUC并发工具类在大厂的应用场景详解 (1).pdf ...8、读写锁ReentrantReadWriteLock&StampLock详解.pdf 9、并发容器 (Map、List、Set) 实战及其原理.pdf 10、阻塞队列BlockingQueue 实战及其原理分析.pdf
6.JUC并发工具类在大厂的应用场景详解 (1).pdf ...8、读写锁ReentrantReadWriteLock&StampLock详解.pdf 9、并发容器 (Map、List、Set) 实战及其原理.pdf 10、阻塞队列BlockingQueue 实战及其原理分析.pdf
6.JUC并发工具类在大厂的应用场景详解 (1).pdf ...8、读写锁ReentrantReadWriteLock&StampLock详解.pdf 9、并发容器 (Map、List、Set) 实战及其原理.pdf 10、阻塞队列BlockingQueue 实战及其原理分析.pdf
读写锁认识与原理.mp4 细读ReentrantReadWriteLock源码.mp4 ReentrantReadWriteLock锁降级详解.mp4 线程安全性问题简单总结.mp4 线程之间的通信之wait notify.mp4 通过生产者消费者模型理解等待唤醒机制.mp4 ...
java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
读写锁是将被锁保护的临界资源的读操作和写操作分开,允许同时有多个线程同时对临界资源进行读操作,任意时刻只允许一个线程对资源进行写操作。简单的说,对与读操作采用的是 共享锁 ,对于写操作采用的是 排他锁...
第25节读写锁认识与原理00:18:04分钟 | 第26节细读ReentrantReadWriteLock源码00:30:38分钟 | 第27节ReentrantReadWriteLock锁降级详解00:13:32分钟 | 第28节线程安全性问题简单总结00:15:34分钟 | 第29节线程...