在世界范围构建可靠的分布式系统往往要求在一致性和可用性之间进行权衡。上个月,亚马逊公司的 CTO Werner Vogels 发表了一篇文章,描述在大型分布式系统中容忍最终数据一致性的方法。
正如 InfoQ 之前的一篇新闻里所讨论的:
系统架构师角色关键的一方面就是衡量相互冲突的需求、决定解决方案,常常要牺牲一个方面来换取另一个方面。
亚马逊公司的 CTO Werner Vogels 发布的新帖子讨论了这些基本需求如何应用于基础设施服务,为构建 Internet 范围的计算平台提供资源。
鉴于这些系统分布在世界范围内,我们处处利用复制技术来保证稳定的性能和高可用性。尽管复制技术使我们达到部分目的,但它的实现并不是完全透明的;在许多情况下,在服务内部使用复制技术都会给服务的客户带来后果。后果之一体现为对数据一致性的限制,特别是在底层分布式系统提供了一种最终一致的数据复制模型的时候。在亚马逊设计这些大型系统时,我们凭借一套有关大规模数据复制的指导原则和抽象,把注意力集中于高可用性和数据一致性之间的权衡选择。
按照 Werner 所说,考虑一致性有两种方式:一种是从开发者 ...
java并发教程
未读ConcurrentHashMap是Java 5中支持高并发、高吞吐量的线程安全HashMap实现。闲话少说,通过仔细阅读源代码,现在总算理解ConcurrentHashMap实现机制了,其实现之精巧,令人叹服,与大家共享之。
实现原理
锁分离 (Lock Stripping)ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。
有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。这里“按顺序”是很重要的,否则极有可能出现死锁,在ConcurrentHashMap内部,段数组是final的,并且其成员变量实际上也是final的,但是,仅仅是将数组声明为final的并不保证数组成员也是fi ...
简介
HDFS(Hadoop Distributed File System )Hadoop分布式文件系统。是根据google发表的论文翻版的。论文为GFS(Google File System)Google 文件系统(中文,英文)。
HDFS有很多特点:
**① **保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存3份。
**② **运行在廉价的机器上。
**③ **适合大数据的处理。多大?多小?HDFS默认会将文件分割成block,64M为1个block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。如果小文件太多,那内存的负担会很重。
如上图所示,HDFS也是按照Master和Slave的结构。分NameNode、SecondaryNameNode、DataNode这几个角色。
NameNode:是Master节点,是大领导。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;
SecondaryNameNode:是一个小弟,分担大哥namenode的工作量;是NameNode的冷备份;合并fsimage和fse ...
多线程-并发
未读NUMA与SMPSMP(Symmetric Multi-Processor),即对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP的优点是能够保证内存一致性,缺点是这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,每个CPU都要访问相同的内存资源,可能导致内存访问冲突,可能会导致CPU资源的浪费。常用的PC机就属于这种。
NUMA(Non-Uniform Memory Access)非一致存储访问,将CPU分为CPU模块,每个CPU模块由多个CPU组成,并且具有独立的本地内存、I/O槽口等,模块之间可以通过互联模块相互访问,访问本地内存的速度将远远高于访问远地内存(系统内其它节点的内存)的速度,这也是非一致存储访问NUMA的由来。NUMA优点是可以较好地解决原来SMP系统的扩展问题,缺点是由于访问远地内存的延时远远超过本地内存,因此当CPU数量增加时,系统性能无法线性增加。
CLH算法实现CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示 ...
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220 ...
1. JUC概况以下是Java JUC包的主体结构:
Atomic : AtomicInteger
Locks : Lock, Condition, ReadWriteLock
Collections : Queue, ConcurrentMap
Executer : Future, Callable, Executor
Tools : CountDownLatch, CyclicBarrier, Semaphore
2. 原子操作多个线程执行一个操作时,其中任何一个线程要么完全执行完此操作,要么没有执行此操作的任何步骤,那么这个操作就是原子的。出现原因: synchronized的代价比较高。
以下以AtomicInteger为例:
int addAndGet(int delta):以原子方式将给定值与当前值相加。 实际上就是等于线程安全版本的i =i+delta操作。
boolean compareAndSet(int expect, int update):如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。 如果成功就返回true ...
Java.util.concurrent.atomic.AtomicReference是一个旨在以线程安全的方式更新变量的类。Why do we need the class AtomicReference? 为什么我们不能简单地使用一个volatile变量?我们如何正确使用它?
Why AtomicReference?对于我正在编写的工具,我需要检测是否从多个线程中调用了一个对象。我为此使用以下不可变类:
1234567891011121314151617181920212223242526272829public class State { private final Thread thread; private final boolean accessedByMultipleThreads; public State(Thread thread, boolean accessedByMultipleThreads) { super(); this.thread = thread; this.accessedByMultipleThreads = acce ...
java并发教程
未读一个Java 5中最好添加的是支持类,如原子操作AtomicInteger,AtomicLong等等。这些课程帮助您最大限度地减少复杂的(非必要)需要多线程的,如增加一些基本的操作代码或递减的值在多个线程之间共享。这些类在内部依赖于名为CAS(比较和交换)的算法。在本文中,我将详细讨论这个概念。
1.Optimistic and Pessimistic Locking传统的锁定机制,例如在Java中使用synced关键字,被称为是锁定或多线程的悲观技术。它要求您首先保证没有其他线程会干扰某些操作(即锁定对象),然后仅允许您访问任何实例/方法。
就像说“请先关上门;否则,其他骗子会进来重新整理您的东西。”
尽管上述方法是安全的并且确实有效,但是它在性能方面给您的应用程序带来了重大损失。原因很简单,等待线程无法做任何事情,除非它们也有机会执行受保护的操作。
存在一种在性能上更有效并且本质上是乐观的方法。使用这种方法,您可以进行更新,希望可以在没有干扰的情况下完成更新。此方法依靠冲突检测来确定更新期间是否存在来自其他方的干扰,在这种情况下,操作将失败并且可以重试(或不重试)。
乐观 ...
系列内容:
第 1 部分: 类和类装入
第3部分: 应用反射
第 5 部分: 动态转换类
第 6 部分: 利用 Javassist 进行面向方面的更改
第 7 部分: 用 BCEL 设计字节码
第 8 部分: 用代码生成取代反射
本文是这个新系列文章的第一篇,该系列文章将讨论我称之为 Java 编程的动态性 的一系列主题。这些主题的范围从 Java 二进制类文件格式的基本结构,以及使用反射进行运行时元数据访问,一直到在运行时修改和构造新类。贯穿整篇文章的公共线索是这样一种思想:在 Java 平台上编程要比使用直接编译成本机代码的语言更具动态性。如果您理解了这些动态方面,就可以使用 Java 编程完成那些在任何其它主流编程语言中不能完成的事情。
本文中,我将讨论一些基本概念,它们是这些 Java 平台动态特性的基础。这些概念的核心是用于表示 Java 类的二进制格式,包括这些类装入到 JVM 时所发生的情况。本文不仅是本系列其余几篇文章的基础,而且还演示了开发人员在使用 Java 平台时碰到的一些非常实际的问题。
用二进制表示的类使用 Java 语言的开发人员在用编译器编译他们的源代码 ...
IBM®
站点地图
关闭
Servlet 3.0 新特性概述Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声:
异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。
新增的注解支持:该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。
可插性支持:熟悉 Struts2 的开发者一定会对其通过插件的方式与包括 Spring 在内的各种常用框架的整合特性记忆犹新 ...