- 浏览: 493451 次
- 性别:
- 来自: 广州
最新评论
-
cppmule:
Play!在国内实际产品级应用案例有吗?有哪些公司在用?国外的 ...
play总结性介绍 -
你好javaword:
netty的个人使用心得 -
hyfwuhui:
java 并发环境下使用ConcurrentHashMap -
asialee:
朋在无锡 写道可以将Channels使用静态导入的方式:imp ...
netty的个人使用心得 -
朋在无锡:
可以将Channels使用静态导入的方式:import sta ...
netty的个人使用心得
多线程读取并修改一个资源时,通常使用synchronized同步锁。性能损失情况很严重。jdk5.0以后提供了新的ReentrantReadWriteLock可以提供比synchronized更高性能的并发。
Dictionary.java
import java.util.HashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class Dictionary {
private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final Lock read = readWriteLock.readLock();
private final Lock write = readWriteLock.writeLock();
private HashMap<String, String> dictionary = new HashMap<String, String>();
public void set(String key, String value) {
write.lock();
try {
dictionary.put(key, value);
} finally {
write.unlock();
}
}
public String get(String key) {
read.lock();
try {
return dictionary.get(key);
} finally {
read.unlock();
}
}
public String[] getKeys() {
read.lock();
try {
String keys[] = new String[dictionary.size()];
return dictionary.keySet().toArray(keys);
} finally {
read.unlock();
}
}
public static void main(String[] args) {
Dictionary dictionary = new Dictionary();
dictionary.set("java", "object oriented");
dictionary.set("linux", "rulez");
//dictionary.set("C++", "lanjh");
Writer writer = new Writer(dictionary, "Mr. Writer ");
//Writer writer2 = new Writer(dictionary, "Mr. Writer 2");
Reader reader1 = new Reader(dictionary, "Mrs Reader 1");
Reader reader2 = new Reader(dictionary, "Mrs Reader 2");
Reader reader3 = new Reader(dictionary, "Mrs Reader 3");
Reader reader4 = new Reader(dictionary, "Mrs Reader 4");
Reader reader5 = new Reader(dictionary, "Mrs Reader 5");
writer.start();
//writer2.start();
reader1.start();
reader2.start();
reader3.start();
reader4.start();
reader5.start();
}
}
Reader.java
public class Reader extends Thread{
private Dictionary dictionary = null;
public Reader(Dictionary d, String threadName) {
this.dictionary = d;
this.setName(threadName);
}
private boolean runForestRun = true;
public void run() {
while (runForestRun) {
String [] keys = dictionary.getKeys();
for (String key : keys) {
//reading from dictionary with READ LOCK
String value = dictionary.get(key);
//make what ever you want with the value.
System.out.println(this.getName()+" = "+key + " : " + value);
}
//update every seconds
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void stopReader(){
this.runForestRun = false;
this.interrupt();
}
}
Writer.java
public class Writer extends Thread{
private boolean runForestRun = true;
private Dictionary dictionary = null;
public Writer(Dictionary d, String threadName) {
this.dictionary = d;
this.setName(threadName);
}
@Override
public void run() {
while (this.runForestRun) {
String [] keys = dictionary.getKeys();
for (String key : keys) {
String newValue = getNewValueFromDatastore(key);
//updating dictionary with WRITE LOCK
dictionary.set(key, newValue);
System.out.println(this.getName()+" = "+key + " : " + newValue);
}
//update every seconds
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void stopWriter(){
this.runForestRun = false;
this.interrupt();
}
public String getNewValueFromDatastore(String key){
//This part is not implemented. Out of scope of this artile
return key;
}
}
发表评论
-
netty4更新详解
2015-11-14 10:52 620netty现在应该是java界最流行的网络框架之一了,高性能, ... -
Lua使用protocolbuf
2015-11-10 16:04 842在https://code.google.com/p/prot ... -
领域模型设计
2015-09-12 17:29 664一:面向对象设计中最简单的部分与最难的部分 如果说事务脚本是 ... -
关于分表与分库思路
2015-07-06 15:36 557首先主要实现应该参考开源产品,目前比较能上台面的是 tddl, ... -
NAT穿透解决方案介绍
2015-04-01 03:12 1965最近公司要实现在各种网络环境下面的多屏互动(机顶盒、andro ... -
音视频即时通讯开发中使用P2P技术的好处
2015-04-01 02:59 724在服务器的配置文件“A ... -
nat穿透原理
2015-04-01 02:01 1030一直以来,说起NAT穿透,很多人都会被告知使用UDP打孔这个技 ... -
Erlang学习记录(二)——基本数据类型
2015-03-30 03:51 428Erlang学习记录(二)—— ... -
集群、分布式、负载均衡区别与联系
2015-03-25 22:54 5681、Linux集群主要分成三 ... -
: 结构化数据的共享存储
2015-03-24 04:25 0开发笔记 (6) : 结构化数据的共享存储 开始这个话题前, ... -
:如何构建超强伸缩性的游戏服务器而集容错、负载均衡和无限伸缩性于一身
2015-03-24 04:04 882附标题:如何构建超强 ... -
edis在游戏服务器中的应用
2015-03-24 02:57 600edis在游戏服务器中的应 ... -
社交游戏之双机热备方案 预防单点故障
2015-03-23 04:46 854某一天深夜,单盘配置的服务器出现硬盘损坏,导致该服务器上所提 ... -
游戏服务器集群设计思路
2015-03-23 04:45 767对于我们的游戏服务器端来说,除了要满足一般的MMO服务 ... -
Erlang类型及函数声明规格
2015-03-04 14:33 633Erlang类型及函数声明规格 Author: Mail: ... -
(转)erlang lists模块函数使用大全
2015-02-12 16:26 542一,带函数Pred 1, all(Pred ... -
超越并行框架erlang之流的通讯框架
2015-02-05 17:41 596http://blog.codingnow.com/2011/ ... -
如何使用 Oracle Linux 中的硬件故障管理
2014-11-10 14:38 1398如何使用 Oracle Linux 中 ... -
配置nginx
2014-06-14 18:04 568http://www.cnblogs.com/wenanry/ ... -
centos 安装mysql
2014-06-13 12:23 572你是root權限嗎?_操作系統的_ 兩種方法 1 使用替換法 ...
相关推荐
读写锁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 多线程与并发(12_26)-JUC锁_ ReentrantReadWriteLock详解
针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它表示两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁 类图如下: 说明:如上图所示Sync为ReentrantReadWriteLock...
本篇文章主要介绍了Java concurrency之共享锁和ReentrantReadWriteLock,非常具有实用价值,需要的朋友可以参考下
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
ReentrantReadWriteLock 读写锁除了保证写操作对读操作可见性以及并发行提升外,简化了读写交互场景开发
下面小编就为大家带来一篇ReadWriteLock接口及其实现ReentrantReadWriteLock方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了Java多线程 ReentrantReadWriteLock原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本.mp4
6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本副本.mp4
ReentantLock 继承接口 Lock 并实现了接口中定义的方法, 它是一种可重入锁, 除了能完成 synchronized 所能完成的所有工作外,还提供了诸如可响应中断锁、可轮询锁请求、定时锁等 避免多线程死锁的方法。 尝试非...
java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 ... 性能 线程活跃与线程饥饿 同步工具类 原子操作类 AtomicInteger等 相当于加上synchronized 也有些利用硬件底层能力CAS
6.JUC并发工具类在大厂的应用场景详解 (1).pdf ...8、读写锁ReentrantReadWriteLock&StampLock详解.pdf 9、并发容器 (Map、List、Set) 实战及其原理.pdf 10、阻塞队列BlockingQueue 实战及其原理分析.pdf
什么是读锁和写锁 对于资源的访问就两种形式:要么是读操作,要么是写操作。读写锁是将被锁保护的临界资源的读操作和写操作分开,允许同时有多个线程同时对临界资源进行读操作,任意时刻只允许一个线程对资源进行写...
ReentrantLock//互斥锁 class CachedData { Object data; volatile boolean cacheValid; ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
ReadWriteLock的使用,实际上由于ReadWriteLock是一个接口,所以实际使用的是ReentrantReadWriteLock子类。同时ReadWriteLock的使用其实也是比较简单的,就是读写的锁的使用以及注意事项而已。
主要介绍了举例说明Java多线程编程中读写锁的使用,文中的例子很好地说明了Java的自带读写锁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