多线程-并发
未读这个故事源自一个很简单的想法:创建一个对开发人员友好的、简单轻量的线程间通讯框架,完全不用锁、同步器、信号量、等待和通知,在 Java 里开发一个轻量、无锁的线程内通讯框架;并且也没有队列、消息、事件或任何其他并发专用的术语或工具。
只用普通的老式 Java 接口实现 POJO 的通讯。
它可能跟 Akka 的类型化 actor 类似,但作为一个必须超级轻量,并且要针对单台多核计算机进行优化的新框架,那个可能有点过了。
当 actor 跨越不同 JVM 实例(在同一台机器上,或分布在网络上的不同机器上)的进程边界时,Akka 框架很善于处理进程间的通讯。
但对于那种只需要线程间通讯的小型项目而言,用 Akka 类型化 actor 可能有点儿像用牛刀杀鸡,不过类型化 actor 仍然是一种理想的实现方式。
我花了几天时间,用动态代理,阻塞队列和缓存线程池创建了一个解决方案。
图一是这个框架的高层次架构:
图 1 框架的高层次架构
SPSC 队列是指单一生产者 / 单一消费者队列。MPSC 队列是指多生产者 / 单一消费者队列。
派发线程负责接收 Actor 线程发送 ...
在一般的Java应用开发过程中,开发人员使用Java的方式比较简单。打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了。这种开发模式背后的过程是:开发人员编写的是Java源代码文件(.java),IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码(byte code),以类文件的形式保存在磁盘上(.class)。Java虚拟机(JVM)会负责把Java字节代码加载并执行。Java通过这种方式来实现其“编写一次,到处运行(Write once, run anywhere)” 的目标。Java类文件中包含的字节代码可以被不同平台上的JVM所使用。Java字节代码不仅可以以文件形式存在于磁盘上,也可以通过网络方式来下载,还可以只存在于内存中。JVM中的类加载器会负责从包含字节代码的字节数组(byte[])中定义出Java类。在某些情况下,可能会需要动态的生成 Java字节代码,或是对已有的Java字节代码进行修改。这个时候就需要用到本文中将要介绍的相关技术。首先介绍一下如何动态编译Java源文件。
动态编译Java源文件在一般情况 ...
1. 概述很多企业选择MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么情况下,各种原因导致MySQL会丢失部分数据。本文不讨论Oracle和MySQL的优劣,仅仅关注MySQL丢失数据的几种情况。希望能够抛砖引玉,让各位MySQL大牛们梳理出MySQL最安全或者性价比合适的适合各种应用场景的方案。
2. 问题定义一般我们希望把一系列的数据作为一个原子操作,这样的话,这一系列操作,要么提交,要么全部回滚掉。
当我们提交一个事务,数据库要么告诉我们事务提交成功了,要么告诉我们提交失败。
数据库为了效率等原因,数据只保存在内存中,没有真正的写入到磁盘上去。如果数据库响应为“提交成功”,但是由于数据库挂掉,操作系统,数据库主机等任何问题导致这次“提交成功”的事务对数据库的修改没有生效,那么我们认为这个事务的数据丢失了。这个对银行或者支付宝这种业务场景来说是不能接受的。所以,保证数据不丢失也是数据库选择的一个重要衡量指标
mysql的架构和普通的数据库架构最大的差异在于它使用插件式的存储引擎。数据的存取由存储引擎负责。要了解MySQL数据丢失的问题就需要从MyS ...
1,创建索引对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。
2,复合索引比如有一条语句是这样的:select * from users where area=’beijing’ and age=22;如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age, salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。 ...
Servlet
什么是Servlet? Servlet是一个JavaEE组件,是在服务器端运行以处理客户端请求并作出响应的程序。
Servlet的执行过程?首先,客户端发送请求到服务器端;
其次,服务器端根据web.xml文件中的Servlet相关配置信息,将客户端请求转发到相应的Servlet;
之后,Servlet会根据request对象中封装的用户请求与数据库进行交互,返回数据之后,Servlet会将返回的数据封装到response对象中;
此时,控制权从Servlet重新回到服务器端,最后,服务器端将响应信息返回给客户端,并且跳转到相应的页面。
Servlet的生命周期?1)加载和实例化;在第一次请求Servlet时,Servlet容器将会创建Servlet实例;
2)初始化;Servlet容器加载完成Servlet之后,必须进行初始化,此时,init方法将被调用;
3)Servlet初始化之后,就处于响应请求的就绪状态,此时如有客户端请求发送,就会调用Servlet实例的service方法,并且根据用户的请求方式,调用doPost或者doGet方法;
4)最后,Serv ...
一直想抽空把Spring源码拿来读读,但真正去做这件事的时候发现不简单,Spring发展这么多年,它的规模已不是一个一般的开源框架所能比的,它的主要架构和流程不是非常清晰,很难抓到要害,但有一点可以肯定,它的根基是IoC和AOP,所有的功能扩展和对其他开源框架的支持都是基于这两点来做的,因此要搞定Spring源码主要就是要搞定IoC和AOP这两块。
IoC从原理上来说是非常简单的,无非就是从配置文件解析开始到最后在内置容器中管理各个对象,但从Spring IoC源码上看是个非常庞大的体系,因为Spring能支持的特性太多,针对这一点,我已不太可能仔细地阅读每一个细节,也不太可能通过什么方式把这些细节在有限的篇幅中表达出来,只能抓住关键生命周期中关键步骤。
在我看来,IoC最核心就是两个过程:IoC容器初始化和IoC依赖注入,下面通过简单的图示来表述其中的关键过程。
Spring源码学习(二)—— AOP
AOP有些特有的概念,如:advisor、advice和pointcut等等,使用或配置起来有点绕,让人感觉有些距离感,其实它的实现就是一组标准的设计模式的组合使用:Facto ...
A diagram is sometimes worth 1000 words. The following diagrams are from Java tutorials on Program Creek, they have received the most votes so far. Hopefully, they can help you review what you already know. If the problem is not clear by the diagram itself, you may want to go to each article to take a further took.
1. String Immutability
The following diagram shows what happens for the following code:
12String s = "abcd";s = s.concat("ef");
2. The equals() and hashCode() Co ...
TreeMap有Values、EntrySet、KeySet、PrivateEntryIterator、EntryIterator、ValueIterator、KeyIterator、DescendingKeyIterator、NavigableSubMap、AscendingSubMap、DescendingSubMap、SubMap、Entry共十三个内部类。Entry是在TreeMap中用于表示树的节点的内部类,已经在《TreeMap源码分析——基础分析》中分析过。下面逐一介绍上面的内部类以及TreeMap中提供的和内部类相关的方法。
TreeMap有Values、EntrySet、KeySet、PrivateEntryIterator、EntryIterator、ValueIterator、KeyIterator、DescendingKeyIterator、NavigableSubMap、AscendingSubMap、DescendingSubMap、SubMap、Entry共十三个内部类。Entry是在TreeMap中用于表示树的节点的内部类,已经在《TreeMa ...
英文原文:Software Development Lessons Learned from Poker
我以前不是做软件开发的。在加入ThoughtWorks两年之前,我主要靠玩扑克为生。当然,如果你曾跟我打听过我前臂上的纹身,那你肯定已然听过我的故事了。要是还没有,等下次我们一起喝一杯时,我可以讲给你听。
我从未因为花这么长时间玩牌而感到过遗憾,从中我学到了一些放之四海而皆准的知识。开发软件的时间愈久,我就愈加确信这二者之间具有令人难以置信的相似性。
学习
我学习打扑克和学习软件开发的方式是一样的:尽可能多读书。我用两年的时间,读完了所能找到的每一本有关扑克的书。最后竟至39本之多。编程亦如是。此刻,我面前仍然摆着接下来要读的5本书;而在过去三年ThoughtWorks的工作中,我翻烂的书亦不在少数。
我认为,无论编程还是玩牌,阅读书籍、博客与杂志都是要想有所成就的必备条件;而若要以二者为谋生之业,仅靠读书却是远远不够的。也许你可以把书本上的一切知识都装入脑中,但知道在何时应用何种规则,这才是真正高手的标志。
诚然,开卷有益。但总要走过万里路 ...
英文原文:The Best Developer Team Structure
在灭火时,有一种“水桶阵型”——队伍中所有人排成一列或几列,将水桶从水源处传递到火灾现场。这样在团队协作时甚至不需要语言交流,但显然不适用于软件开发。
Scott根据自身经验,针对软件开发总结了以下几点建议,不一定全面但是值得参考。CSDN编译如下:
组织架构是完成工作的工具,你需要好的工具来增加工作效率。没有永远最佳的组织架构,每一个项目都有最适合它的架构。
我个人的工作经历主要是关于网站早期开发,这是一门非常特定的工作,因此非常偏向于敏捷/迭代的工作模式,如果你是为银行或者航空公司做开发,肯定需要不同的工具和组织架构。
根据我的经验,通常3-5个开发者围绕这一个PM(项目经理)能够达到最佳的工作效率。PM是一个过于复杂并且常被滥用的术语,坦率地说,我非常讨厌这个词。这里我所说的PM是指“解释、阐明项目需求的人”,因此从产品战略的角度PM需要有强烈的想法,清楚需要构建的是什么,但他们更重要的任务是权衡从客户到设计师等等的全部利益相关者的需求,并据此制定计划。
...
