生产者消费者模型你知道多少(转)

Posted by & filed under Uncategorized.

原文地址:http://blog.csdn.net/luohuacanyue/article/details/14648185 背景 进入正题之前先说点故事。从最开始学java的那里开始:我是从08年下半年开始学Java,在《我的六年程序之路》中提到了一些。当时比较简单,每天看尚学堂的视频(对于初学者而言看视频好一些。),然后写代码。比较清楚的记得马士兵讲到生产者消费者模型的时候还大谈特谈要是掌握了这个工资可以+1000(现在回忆起有点像历史一样,多少有些伤感)。那时候已经过年了,我在家的时候把那段代码敲了很多遍,不过基本上是默写下来的,也没有仔细的想过其中的一些细节,不久后我就忘记了其中的写法。这里又衍生出一个学习方法的问题。我在学习上一直有一个毛病:学习的过程中不会刨根问底,这导致很多问题思考的不透彻,在后面很大程度上影响我整个知识体系的扎实程度,也应了那句话:出来混迟早要还的,在学习技术的过程中就是要一步一个脚印,总有一天会豁然开朗,不知不觉的发现所有知识都串起来了,一件很神奇的事情。在技术学习的过程中还是需要有点钻牛角尖的精神,基本上技术上的大牛都有钻牛角尖的“毛病”。 第二段故事是在2012年,这是正儿八经的使用生产者消费者模型在项目中进行开发,中间也写出了一大堆问题,这个不是写出来的,是慢慢调试出来的。最开始使用wait(),notify(),后来用CountDownLatch。 第三个故事是前几天的事情,这也是我为什么要写这篇文章的原因。一个同事问我代码的问题,他里面就是用到了生产者消费者,当时我整了半天都没整利索,很没面子。后面虽然找出了问题(这个问题我今天也碰到了),就是习惯性的把整个容器(下面代码的Container)锁住,然后发现只要一个线程wait住,所有线程都不动了,因为这个wait住的线程还持有Container的锁没有释放,其他线程也就进不来。我发现自己对于这个模型并没有完全摸透,就在周末的时候好好的把这个模型从头到尾的写了写,当然从中又有一些新的收获。   正题   Read more […]

Spring 动态设置数据源

Posted by & filed under Uncategorized.

Spring2.0.1以后的版本已经支持配置多数据源,并且可以在运行的时候动态加载不同的数据源。通过继承AbstractRoutingDataSource就可以实现多数据源的动态转换。目前做的项目就是需要访问12个数据源,每个数据源的表结构都是相同的,所以要求数据源的变动对于编码人员来说是透明,也就是说同样SQL语句在不同的环境下操作的数据库是不一样的。具体的配置如下: 一、首先需要写一个静态的键值对照类: 代码 Java代码   package cn.com.xinli.ccp.dynamicds; public class DataSourceMap {     public static final String Admin=”Admin”;     public static final String Yxh = “Yxh”; } 这个类主要在使用的时候当作获得数据源的标志使用。 二、建立一个获得和设置上下文的类: 代码 Java代码   package cn.com.xinli.ccp.dynamicds; public class CustomerContextHolder {     private static final ThreadLocal contextHolder =         new ThreadLocal();     public static void setCustomerType(String customerType) {       contextHolder.set(customerType);     }     public static String getCustomerType() {       return (String) contextHolder.get();     }     public static void clearCustomerType() {       contextHolder.remove();     } } 这个主要负责设置上下文环境和获得上下文环境。 三、建立动态数据源类,这个类必须继承AbstractRoutingDataSource: 代码 Java代码   package cn.com.xinli.ccp.dynamicds; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource extends AbstractRoutingDataSource {     protected Object determineCurrentLookupKey() {         // TODO Auto-generated method stub         return CustomerContextHolder.getCustomerType();     } } 这个类实现了determineCurrentLookupKey方法,该方法返回一个Object,一般是返回字符串,也可以是枚举类型。该方法中直接使用了CustomerContextHolder.getCustomerType()方法获得上下文环境并直接返回。 四、编写spring的配置文件配置数据源 代码 Java代码   <bean id=”parentDataSource”             class=”org.springframework.jdbc.datasource.DriverManagerDataSource”>             <property name=”driverClassName”>                 <value>COM.ibm.db2.jdbc.net.DB2Driver</value>             </property>             <property name=”url”>                 <value>jdbc:db2:127.0.0.1:TEST</value>             </property>     </bean>     <bean id=”adminDataSource” parent=”parentDataSource”>         <property name=”username” value=”admin”/>         <property name=”password” value=”master997mb”/>     </bean>     <bean id=”yxhDataSource” parent=”parentDataSource”>         <property name=”username” value=”yxh”/>         <property name=”password” value=”yxh”/>     </bean> 在这个配置中可以看到首先有个parentDataSource,这个主要配置一些数据源的公用信息,项目中都是链接DB2数据库;adminDataSource和yxhDataSource是根据不同需要配置的个性化信息,但都必须加parent属性,值为parentDataSource。这样就配置好了2个数据源信息。当然如果链接的多数据源是不同类型的两个数据库,那么parentDataSource就可以不要了,直接配置两个不同的数据源链接就可以了。 五、编写spring配置文件配置多数据源映射关系 代码 Java代码   <bean id=”dataSource” class=”cn.com.xinli.ccp.dynamicds.DynamicDataSource”>        <property name=”targetDataSources”>           <map key-type=”java.lang.String”>              <entry key=”Yxh” value-ref=”yxhDataSource”/>           </map>        </property>        <property name=”defaultTargetDataSource” ref=”adminDataSource”/>     </bean> 在这个配置中第一个property属性配置目标数据源,<map Read more […]

处理器拦截器详解

Posted by & filed under Uncategorized.

5.1、处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。   5.1.1、常见应用场景 1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。 2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面; 3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录); 4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。 5、OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。 …………本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。 5.1.2、拦截器接口   java代码: 查看复制到剪贴板打印 package org.springframework.web.servlet; public interface HandlerInterceptor {     boolean preHandle(             HttpServletRequest request, HttpServletResponse response,             Object handler)             throws Exception;     void postHandle(             HttpServletRequest request, HttpServletResponse response,             Object handler, ModelAndView modelAndView)             throws Exception;     void afterCompletion(             HttpServletRequest request, HttpServletResponse response,             Object handler, Exception ex)             throws Exception; } 我们可能注意到拦截器一个有3个回调方法,而一般的过滤器Filter才两个,这是怎么回事呢?马上分析。   preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现);      返回值:true表示继续流程(如调用下一个拦截器或处理器); false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应; postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。 afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。   5.1.3、拦截器适配器 有时候我们可能只需要实现三个回调方法中的某一个,如果实现HandlerInterceptor接口的话,三个方法必须实现,不管你需不需要,此时spring提供了一个HandlerInterceptorAdapter适配器(一种适配器设计模式的实现),允许我们只实现需要的回调方法。   java代码: 查看复制到剪贴板打印 public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {      //省略代码 此处所以三个回调方法都是空实现,preHandle返回true。 } 5.1.4、运行流程图   图5-1 Read more […]

js设置cookie

Posted by & filed under Uncategorized.

cookie 与 session 是网页开发中常用的信息存储方式。Cookie是在客户端开辟的一块可存储用户信息的地方;Session是在服务器内存中开辟的一块存储用户信息的地方. JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的。 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一种情况,在某个用例流程中,由A页面跳至B页面,若在A页面中采用JS用变量temp保存了某一变量的值,在B页面的时候,同样需要使用JS来引用temp的变量值,对于JS中的全局变量或者静态变量的生命周期是有限的,当发生页面跳转或者页面关闭的时候,这些变量的值会重新载入,即没有达到保存的效果。解决这个问题的最好的方案是采用cookie来保存该变量的值,那么如何来设置和读取cookie呢? 首先需要稍微了解一下cookie的结构,简单地说:cookie是以键值对的形式保存的,即key=value的格式。各个cookie之间一般是以“;”分隔。 JS设置cookie: 假设在A页面中要保存变量username的值(“jack”)到cookie中,key值为name,则相应的JS代码为: document.cookie=”name=”+username; Read more […]

【转】每个程序员都应该知道的8个Linux命令

Posted by & filed under Uncategorized.

  转自:http://www.csdn.net/article/2012-09-13/2809917-Linux-Commands-Every%20Developer-Should-Kn Linux里有很丰富的各种命令,有些是很难用的。然而,学会了前面说的这8个命令,你已经能处理大量的log分析任务了,完全不需要用脚本语言写程序来处理它们。 每个程序员,在职业生涯的某个时刻,总会发现自己需要知道一些Linux方面的知识。我并不是说你应该成为一个Linux专家,我的意思是,当面对Linux命令行任务时,你应该能很熟练的完成。事实上,学会了下面8个命令,我基本上能完成任何需要完成的任务。 注意:下面的每个命令都有十分丰富的文档说明。这篇文章并不是来详尽的展示每个命令的各种功用的。我在这里要讲的是这几个最常用的命令的最常见用法。如果你对linux命令并不是很了解,你想找一些这方面的资料学习,那这篇文章将会给你一个基本的指导。 让我们从处理一些数据开始。假设我们有两个文件,分别记录的订单清单和订单处理结果。 order.out.log   8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99   8:23:45 112, 1, Joy of Clojure, Hardcover, 29.99   8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99   order.in.log   8:22:20 111, Order Complete   8:23:50 112, Order sent to fulfillment   8:24:20 113, Refund sent to processing cat cat – Read more […]

【转】20个Linux防火墙应用技巧

Posted by & filed under Uncategorized.

  转自:http://www.csdn.net/article/2012-01-17/310905 Netfilter是Linux内置的主机防火墙,它可以使用iptables命令处理IPv4协议,也可以使用ip6tables命令处理IPv6协议。在iptables之前,Linux 2.2中使用ipchains来配置防火墙,Linux 2.0中则使用ipfwadm,它基于BSD的ipfw命令。 以下实例在RHEL 6.x上执行通过,也适用于其他Linux发行版。 1.显示防火墙的状态 以root权限运行下面的命… 导言:随着互联网的飞速发展,毫无疑问,互联网上的安全,操作系统平台的安全也逐渐成为人们所关心的问题。而许多网络服务器、工作站所采用的平台为Linux/UNIX平台。Linux平台作为一个安全性、稳定性比较高的操作系统也被应用到了更多领域。本文带领大家探讨了Linux系统管理员应该掌握的20个防火墙应用技巧。 广为人知的iptables命令行 Netfilter作为Linux内置的主机防火墙,它可以使用iptables命令处理IPv4协议,也可以使用ip6tables命令处理IPv6协议。在iptables之前,Linux Read more […]

【转】C语言内存对齐详解(1)

Posted by & filed under Uncategorized.

  转自:http://blog.csdn.net/wanglang1000/article/details/17710129 一、什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那 Read more […]

【转】有关printf的小问题

Posted by & filed under Uncategorized.

  转自 http://blog.csdn.net/lzl124631x 打印结构体 曾对C++的迭代器不甚了解,于是尝试用printf直接打印迭代器,得到了诡异的输出结果。 测试系统:Win7+VS2010

  当时就震惊了,一时无法理解为何有这样的输出结果。再进行尝试,发现C中也有类似的问题。

  第一个printf给人一种错觉就好像s变换了它的打印值!不过自己好好想想,发现不难理解:printf中指示打印对象的指针每次只移动int的长度,因此打印三次%d只是打印了第一个s的三个成员。至于第二个printf,只是先输出了s的所有成员,然后输出了内存中排在s后面的一些无意义的数据罢了。 这里我有一个地方不明白,为何每次都是0, Read more […]

各种AJAX方法的使用比较

Posted by & filed under Uncategorized.

AJAX技术经过这么多年的发展,出现了一些框架或类库用于简化开发工作,不同的框架类库的使用方法也各不相同。 现在,再回头看看这些技术,看看这些框架类库,我们能感受到技术在不断地发展,AJAX开发越来越容易了。 本文收集了在ASP.NET平台上,一些具体代表性的AJAX开发方法,我将用实际的示例代码来演示如何使用它们, 让您感受AJAX的进化历程,同时也希望将一些优秀的AJAX开发方法介绍给您。 为了方便地介绍这些AJAX开发方法,我将它们划分为四代技术。 注意:按代划分AJAX技术纯属我个人的观点,只为了更好了区分它们。 此外,一些不借助任何框架类库的原始AJAX开发方法,本文将不讨论它们。 第一代技术:生成客户端代理脚本调用服务端 这类技术展示了第一代的AJAX框架的主要设计思想:在服务端为客户端生成代理脚本, Read more […]

PS技巧:将图片存储为WEB所用格式的最佳方式!

Posted by & filed under Uncategorized.

存储为web所用格式 互联网几乎是当今最大的艺术、图形和相片分享平台之一,因此掌握一些保存为网页格式的基础知识就非常重要了。实际上,保存为网页格式是一项平衡艺术——你必须在图片品质和介质的文件尺寸之间做好平衡,以便满足你的个人需求。 在速度相对重要的地方(如迅速地加载网站),你可能需要牺牲一些图片品质。而在品质重要的地方,则需要牺牲一点速度。这堂课程的目的就是向你介绍一些方法,在这两个因素之间寻求平衡,与此同时保留非常好的图像品质。 无损 vs 损耗数据 虽然存在有非常多的图片格式(仅举几例,如jpeg,gif和png),但是依据压缩方法不同,所有的图片都能进一步归类为两大类别:无损和有损。无损数据压缩保证了图像在没有任何品质和信息丢失的情况下重现,而有损数据压缩的结果就是可能造成品质和信息的丢失。在平面设计领域最主流的无损媒介格式包括GIF,PNG,以及TIFF,而JPEG是最主流的有损压缩的图形格式。 如何用PHOTOSHOP保存网页格式 PS拥有非常好的方法来为网页优化图片。在ps中,选择文件>存储为web格式或者使用快捷键ctrl+alt+shift+s。一个新的对话框将会弹出,这里有所有为网页保存和优化图片的设置。 我会通过以下一些生活中的案例来演示如何使用对话框中的设置。 为网页存储图像 由于图片巨大的文件体积,它们更多是以有损压缩格式来保存的。甚至在拍照时,相对于数倍大小的RAW格式,相机也倾向于用有损格式(如JPEG)来保存图片。 JPEG是日常中首选的图片格式,它是以它的创造者“联合图像专家小组”来命名的。Jpeg之所以能够成为标准,是因为它在压缩图像数据的同时可以保留高品质,并且在相关信息上能够接近无损图像的效果。 当你在保存图片的时候,有几种网页格式预设可供选择。对于一张图片,你应该考虑是使用JPEG Read more […]