- 浏览: 526108 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (161)
- 多线程与并发编程 (20)
- 算法和数据结构 (8)
- 缓存 (0)
- HttpClient (2)
- 疑难杂症 (11)
- Java内存管理 (17)
- 分布式开发 (14)
- Linux常用命令 (10)
- OSGI (0)
- UML (2)
- 趣味面试题 (5)
- 设计模式 (8)
- Java类加载 (2)
- JSTL (1)
- Web 服务器 (4)
- IT人生 (3)
- Java基础 (11)
- Flash技术 (7)
- 新知识 (3)
- 常用速备速查 (4)
- 版本控制 (1)
- Java集合工具类 (6)
- web前端技术 (1)
- 趣味话题 (1)
- 安全 (0)
- 架构设计 (5)
- Spring (4)
- 负载均衡技术 (2)
- 持久层技术 (2)
- MySQL单机多实例方案 (1)
- 收藏备用 (0)
- 性能优化 (3)
最新评论
-
liuwuhen:
...
Pushlet的工作原理 -
fbwfbi:
fengchuizhuming 写道楼主的完全正确。鉴定完毕楼 ...
硬件同步原语(CAS)理论 -
passerby_whu:
uule 写道这个测试后结果为:“testPageConten ...
FutureTask的使用方法和使用实例 -
fengchuizhuming:
楼主的完全正确。鉴定完毕
硬件同步原语(CAS)理论 -
edwardjuice:
FutureTask的使用方法和使用实例
目前正在做基于Red 5 的Meeting系统,我们会在Meeting server上生成一个唯一的StreamKey,用于RTMP协议中,NetStream.publish的StreamID,但是有一个问题,我们调用allocateStream的时候,如果一个会议中的多个成员并发请求这个服务时(Meeting server上生成一个唯一的StreamKey),会造成同一个meeting,使用不同的StreamID。
在单虚拟机的情况下,可以使用Synchronized原生锁来对同一个RoomKey进行加锁,如果reques的是同一个RoomKey,则需要排队处理,直到拿到这个StreamKey为止。
此例只适用于单JVM情况下的控制,如果在多虚拟机情况下,需要采用分布式锁的解决方案,可以用ZoomKeeper实现一个基于RoomKey的分布式锁逻辑,以后有空,会写出一个基于ZoomKeeper的分布式锁的版本。
注:此类并发问题,是经常会遇到的,写这篇blog,一方面提出解决方案,另外一方面希望初学者能够有所理解并注意并发访问而产生的问题
1.Class 1
package org.developerworks.test;
import UUIDGenerator;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* <p>Description:
*
* 这个类源自于一个需求:当并发访问时,同一个RoomKey对应只能生成一次UUID,
* 因此需要把RoomKey作为一个对象锁,保证请求同一RoomKey锁的操作要进行同步(或者称为锁定)
* 以保证同一个RoomKey只生成一个UUID
*
* 同步方法不能影响并发性(吞吐量),比如对于不同的RoomKey,并应该允许并发创建
* 对于相同的RoomKey,应该锁定
*
* 此例关键点在于要使用RoomKey作为Synchronized的锁对象,已达到同一个RoomKey,采用排它锁,
* 已避免同一个RoomKey生成了同多个StreamKey的作用
*
* </p>
* <p>Copyright (c) 2010</p>
* <p>Department: None</p>
* <p>Company: None</p>
* <p>Project:Test</p>
*
* @author Tomy Zhou
* @since 1.0
* @version org.developerworks.test; JoinServlet.java
* 2010-7-26
**/
public class JoinServlet extends HttpServlet{
public static ConcurrentHashMap<String, String> map = new ConcurrentHashMap(20);
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String roomKey = req.getParameter("roomKey");
RoomKeySingleton roomKeySingleton = RoomKeySingleton.getInstance(roomKey);
String streamKey = null;
String newUUID = null;
//If the streamKey is not existed on the server, then create one.
//If existed on the server, use the existed
synchronized (roomKeySingleton) {
if(map.get(roomKey)==null){
System.out.println("Concurrent write="+roomKey);
newUUID = UUIDGenerator.getUUID();
map.put(roomKey, newUUID);
System.out.println("Concurrent write complete="+roomKey);
}
}
resp.getWriter().println(roomKey+"-"+newUUID);
}
}
2.Class 2
package org.developerworks.test;
import java.util.concurrent.ConcurrentHashMap;
/**
* <p>Description: WeatherServer</p>
* <p>Copyright (c) 2010</p>
* <p>Department: None</p>
* <p>Company: None</p>
* <p>Project:WeatherServer</p>
*
* 此类用于为每个RoomKey建立一个单例的对象,对应来说,
* 一个RoomKey对应唯一一个对象
* @author Tomy Zhou
* @since 1.0
* @version org.developerworks.test; RoomKeySingleton.java
* 2010-7-26
**/
public class RoomKeySingleton {
private static RoomKeySingleton roomKeySingleton;
private static String roomKey;
private static ConcurrentHashMap<String, RoomKeySingleton> map = new ConcurrentHashMap<String, RoomKeySingleton>();
private RoomKeySingleton(String roomKey){
this.roomKey = roomKey;
}
public static synchronized RoomKeySingleton getInstance(String roomKey){
if(map.get(roomKey)==null){
roomKeySingleton = new RoomKeySingleton(roomKey);
map.put(roomKey, roomKeySingleton);
}
return map.get(roomKey);
}
}
3. Class 3
package org.developerworks.test;
import java.util.UUID;
public class UUIDGenerator {
public UUIDGenerator() {
}
/**
* 获得一个UUID
* @return String UUID
*/
public static String getUUID(){
String s = UUID.randomUUID().toString();
//去掉“-”符号
return s.substring(0,8)+s.substring(9,13)+s.substring(14,18)+s.substring(19,23)+s.substring(24);
}
/**
* 获得指定数目的UUID
* @param number int 需要获得的UUID数量
* @return String[] UUID数组
*/
public static String[] getUUID(int number){
if(number < 1){
return null;
}
String[] ss = new String[number];
for(int i=0;i<number;i++){
ss[i] = getUUID();
}
return ss;
}
public static void main(String[] args){
String[] ss = getUUID(10);
for(int i=0;i<ss.length;i++){
System.out.println(ss[i]);
}
}
}
发表评论
-
死锁实例
2011-05-19 14:21 1946下面这道题,是考死锁的,比较简单,想两个问题: 1.什么时候 ... -
Java存储模型
2011-05-18 13:29 01.什么是存储模型 没有适当的同步,编译器生成指令的次序,可 ... -
设计模式-组合模式
2011-05-16 15:48 1101组合模式的定义: 将对象组合成树的形式来表示整体和局部之 ... -
CompleteService介绍和使用实例
2011-05-11 17:31 3985当向Executor提交批处理任务时,并且希望在它们完成后获得 ... -
CyclicBarrier的使用实例
2011-05-11 15:45 1481CyclicBarrier允许给定数量的线程全部到达关卡点时, ... -
CopyOnWriteArrayList工作原理和实例
2011-05-05 23:43 3384CopyOnWriteArrayList顾名思义,在写入操作时 ... -
Semaphore的介绍和使用实例
2011-04-27 22:32 2809Semaphore可以用来控制能 ... -
FutureTask的使用方法和使用实例
2011-04-27 15:34 13313FutureTask是一种可以取消的异步的计算任务。它的计算是 ... -
CountDownLatch的使用实例
2011-04-26 22:20 8214CountDownLatch CountDownl ... -
Java 并发编程基础-共享对象
2011-04-19 14:48 1447Java 并发编程基础 ... -
从JVM并发看CPU内存指令重排序(Memory Reordering)
2011-04-18 16:17 1481我们都知道,现在的计算机, cpu 在计算的时候 ... -
Java并发编程基础
2011-04-15 14:55 1546Java 并发编程基 ... -
Java多线程基础
2011-04-13 15:52 4739Java 多线程基础 ... 2 ... -
硬件同步原语(CAS)理论
2010-09-24 22:13 6990在Java并发编程中,常常 ... -
java5中使用interrupt()来停止java线程的方法(转)
2010-08-18 23:24 3113在开发java多线程时,如果要停止线程这个问题很头痛吧,不过在 ... -
Java 中的Double Check Lock(转)
2010-07-27 21:13 8094对于多线程编程来说,同步问题是我们需要考虑的最多的问题,同步的 ... -
用并发包中的重入锁实现生产消费模型
2010-06-15 00:07 1434传统的生产消费模型,实际上是通过一个条件来调节生产者和消费者线 ... -
ThreadLocal原理(转)
2010-03-24 18:06 2164http://jzhua.iteye.com/blog/517 ... -
(转)Java偏向锁实现原理(Biased Locking)
2010-03-21 22:24 1364http://www.iteye.com/topic/5180 ... -
生产消费模型实例
2010-03-02 23:23 1711“生产者-消费者-仓储”模型,包含三种角色: 1.生产者 ...
相关推荐
在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面,还没法根本解决大型网站面临的高负载...
在IT行业中,高并发解决方案是针对大量用户同时访问或操作同一系统、应用或服务时,保证系统稳定、高效运行的技术策略。高并发场景通常出现在互联网服务、电子商务、社交媒体、在线游戏以及大数据处理等领域。以下是...
本文将深入探讨Java中的多线程并发访问解决方案,主要围绕以下几个核心知识点进行阐述: 1. **线程同步机制**: - **synchronized关键字**:Java中的synchronized提供了一种内置锁机制,它可以保证同一时间只有一...
针对高并发问题,业界已经发展出了多种有效的解决方案。下面将详细介绍几种常用的优化手段。 ##### 数据库缓存 **数据库缓存**是一种非常有效的方式来缓解数据库的压力,并提高系统的响应速度。通过将经常访问的...
本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题。 SQLite是文件级别的数据库,其锁也是文件级别的:多个线程...
除了上述步骤外,还可以通过其他方法来提高 IIS 的并发访问量,如使用负载均衡、图片和网站分离、CDN 等方法。 通过上述步骤,可以提高 IIS 的并发访问量,达到十万的并发。但是,需要根据实际情况进行调整和优化,...
高并发是指在同一个时间点,有很多用户同时访问URL地址,比如:淘宝的双11、双12,就会产生高并发。又如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击。服务端:导致站点服务器/DB服务器资源被占满崩溃,数据的...
在企业运营中,面对高并发访问是常见的挑战。高并发是指在短时间内大量用户同时访问或操作同一系统,这种情况通常发生在电商平台的大促、社交网络的热点事件或是新闻网站的突发新闻报道等场景。处理高并发问题,需要...
常见的提高高并发下访问的效率的手段,了解高并发的的瓶颈在哪里,具体的高并发解决方案
大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高 性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。这几个解决思路在一定程度上意味...
在构建大型高并发的网站时,...以上知识点都是大型高并发网站解决方案中不可或缺的部分。在实际项目中,需要根据业务需求、现有基础设施和技术团队能力,综合考虑并灵活应用这些策略,以构建稳定、高效的网站系统。
在探讨Java并发编程与高并发解决方案之前,我们首先需要理解几个关键概念:并发(Concurrency)、高并发(High Concurrency)以及多线程(Multithreading)。这些概念是现代软件开发中不可或缺的一部分,尤其是在...
### JavaWeb并发编程与高并发解决方案 #### 一、并发编程概述 在现代软件开发中,尤其是对于基于JavaWeb的应用程序来说,面对大量的用户请求和数据处理任务时,高效的并发处理能力至关重要。并发编程旨在利用多...
### 架构层面高并发解决方案 #### 基本概念 在探讨高并发解决方案之前,首先需要明确几个关键概念。 - **并发**:在操作系统中指的是一个时间段内多个程序同时处于运行状态,但在任何给定时刻只有一个程序在...
在介绍ORACLE数据库并发访问控制机制及访问冲突的解决方法之前,首先需要了解ORACLE数据库的基础知识。作为全球知名的关系型数据库产品,ORACLE数据库具备出色的数据库管理能力、超强的稳定性和良好的并发控制机制,...
在IT行业中,高并发访问是网站和应用程序设计中不可或缺的一部分,尤其对于大型互联网服务来说,如何有效处理大量的并发请求是一项关键技术挑战。本话题将聚焦于如何利用PHP自带的函数进行批处理URL访问,以模拟高...
### Java并发编程与高并发解决方案知识点总结 #### 一、并发与高并发基本概念 ##### 1.1 并发 - **定义**: 指一个程序在同一时刻拥有两个或更多的线程,这些线程可以在单核或多核处理器上运行。 - **单核处理器上...
总的来说,.NET高并发解决方案结合了Entity Framework和RabbitMQ的优势,前者通过对象化操作简化数据库管理,后者通过异步消息处理降低了系统压力。这种组合方式不仅可以提升系统的响应速度,还能保证在高负载情况下...
《高并发网站解决方案:应对海量数据处理挑战》 在当今数字化时代,互联网应用与服务面临着前所未有的挑战,尤其是高并发场景下的数据处理能力。本文基于《高并发网站解决方案.doc》的文档内容,深入探讨了在高并发...