龙潭书斋 -- 303




概述java 在类库设计的过程中,对线程安全做了额外的考虑,因此诞生了丰富的线程安全容器类以及用于协调多个相互写作的线程控制流的同步工具类,特别是在 java5 和 java6 中引入了一些新模块,用来构造并发应用程序的一些常用模式 同步容器类众所周知,HashMap 和 ArrayList 等常用的容器类并不是线程安全的,但在单线程模型下,他们有着很好的执行效率早期,java 通过加锁的方式实现了两个线程安全的同步容器类:Vector 和 Hashtable我们也可以使用 java 类库中提供的 Collections 类的 synchronizedXxxx 方法来创建非线程安全容器的同步容器类如:List<Widget> widgetList = Collections.synchronizedList(new ArrayList<Widget>());  同步容器类的问题同步容器类是线程安全的,但是有些情况下需要客户端加锁来保护复合操作常见的复合操作包括:迭代(遍历容器)跳转(找到下一个元素)条件运算虽然同步容器类的所有操作都是线程安全的,但是当其他线程修
#读书笔记    #技术帖    #龙潭书斋    #sync   
概述前面的日志中,介绍了基本的线程安全知识,本篇日志中将介绍用来保证线程安全的设计模式,这是构建大规模工程的基础 在设计线程安全类的过程中,需要包含以下三个基本要素:找出构成对象状态的所有变量找出月梳妆台变量的不变形条件建立对象状态的并发访问管理策略 类的提供者为了保证开发人员对类的分析和维护,必须将包括如何在不违背对象不变性条件或后延条件的情况下访问对象状态在内的同步策略写入正式文档 实例封闭如果对象不是线程安全的,你可以通过多种技术来确保对象只能由单个线程访问,或者通过锁的方式保护对象的所有访问实例封闭机制是一种将对象实例封装到另一个对象中的线程安全设计模式,通过实例封闭与核实的加锁策略结合,可以确保以线程安全的方式调用非线程安全的对象public class PersonSet { private final Set<Person> mySet = new HashSet<Person>(); public synchronized void addPerson(Person p) { mySet.add(p); } public synchronized boolean containsPerson(Person p) { return mySet.contains(p); } } &nb
#技术帖    #龙潭书斋    #sync    #线程   
开头讲一个故事很久以前,公司的老一代程序员(现在都已经离职)在古老的 restlet 框架的基础上创造了一个 Java MVC 框架,一段框架在程序员的手中代代相传,一个传说流传在程序员之间“所有的 controller 都必须打上 scope=prototype 的烙印”,当这个项目流转到我的手上,当时尚不知道 prototype 意味着什么的我在这个项目上种下了一个小小的 bean,打开了上线系统这个魔盒,等待着项目中的这个种子生根发芽,项目早已是饱经线下测试,我自然是胸有成竹,然而,说时迟那时快,客服电话已是纷至沓来,魔盒中的种子释放出的是混乱与灾难,虽是急急回滚,依然造成了一个多小时的线上故障 -- 所有的用户打开我的订单列表,看到的都是别人的订单记一次重大事故 -- 非线程安全框架引发的意外数据共享 如上面的博文中所述,这个真实的案例发生在 2015 年秋季,日志中也介绍了什么是 prototype,虽然项目饱经测试,但是问题依然没能避免,这就是一场线程安全所引发的灾难,也足见并发环境中的问题难以测试和复现那么,难道真的所有的 Controller 都必须加上 sc
#技术帖    #龙潭书斋    #线程    #thread   
概述java 中的线程同步方式有以下几种方式:synchronized 关键字 -- 内置锁volatile 类型变量java.util.concurrent.atomic 定义的原子变量显式锁 -- java.util.concurrent.locks.ReentrantLock如果在多线程并发环境中对于共享的变量没有使用上述某个合适的同步机制,那么程序就有可能出现错误 无状态类最常见的线程安全类是无状态类,所谓的“无状态类”指的就是类中不包含任何成员,也不包含其他任何类中成员的引用,他仅由若干个成员方法构成,所有的临时状态都存储在线程栈上的局部变量中,线程栈在线程之间是不可以被共享的,因此这样的类在使用中是绝对安全的,调用者无需再考虑任何同步手段 原子性原子操作是线程安全的,原子操作意味着从操作的开始到操作的结束都不会被线程调度机制打断,也就是说它能够保证线程在某段时间对资源的独占,并且整段时间内操作是不可分割的java 提供了 java.util.concurrent.atomic 包用来实现原子操作,如 AtomicInteger 类提供了创建各种锁所常用的 比较并交换操作,这个操作是原子性的需要注意的是,自增操作并
#技术帖    #龙潭书斋    #线程    #thread   
概述此前,我们曾经介绍过 linux 下的进程和线程:线程的基本概念本篇日志中,我们来介绍一下 java 的线程并发模型,主要来看看 java 的线程有哪些优势与潜在的危险 线程的优势多线程并发编程的优势是显而易见的:发挥多处理器的强大能力简化任务模型简化异步事件的处理,降低开发难度任务的快速响应 安全性问题正如此前的日志中详细介绍过的 linux 线程中复杂的安全性问题,java 线程安全性问题也是同样复杂多个线程的执行顺序是不可预测的,因此可能会产生奇怪的结果 public class UnsafeSequence { private int value; public int getNext() { return value++; } } 上面的代码是非线程安全的,尽管这个类中仅仅包含的 getNext 方法看上去非常简单,但它包含了三个操作:读取 value将 value + 1将结果写入 value在多线程并发的情况下,第一个线程还没有执行到第三步时,第二个线程读取 value,那么两个线程将读取到同一个 value 值,因此他们通过加
#技术帖    #技术分享    #线程    #多线程   

200x200


概述上面几篇日志中,我们一步步地搭建、配置了 rabbitmq,经过在此之前的应用介绍,我们已经可以搭建一个相对复杂的多节点分布式生产-消费的分布式应用模型了rabbitmq 实战本篇日志中

#技术帖    #龙潭书斋    #技术分享    #rabbitmq   

200x200


概述上一篇日志中,我们搭建起了 rabbitmq 的集群RabbitMQ 集群搭建 本文中,我们重点来介绍一下集群的配置 rabbitmq 节点类型改

#技术帖    #龙潭书斋    #rabbitmq    #集群   
概述上一篇日志中,我们介绍了使用注解代替传统的 xml 进行依赖注入编程:Spring 3.0 依赖注入的注解实现然而,我们还是必须要提供 ApplicationContext.xml 来进行整个项目的初始化本篇日志中,我们介绍一下如何将一切 xml 配置全部用 java 代码配合相应的注解完成 使用 @Configuration、@ComponentScan 和 @Bean 实现 bean 的自动装载Spring 框架是控制反转 (IOC) 或依赖性注入 (DI) 模式的推动因素,而这种推动是通过基于容器的配置实现的。过去,Spring 允许开发人员使用基于 XML 的配置,通过利用应用程序上下文 XML 文件来管理 bean 依赖性尽管使用 XML 配置较为简单和便捷,但仍有另外一种方法可定义 bean 及其依赖项。这种方法也称为基于 Java 的配置。不同于 XML,基于 Java 的配置使您能够以编程方式管理 
#技术帖    #xml    #config    #配置   

200x200


概述在前面的日志中,我们介绍了 RabbitMQ 的分布式架构 broker:分布式架构 Broker 简介在 RabbitMQ 中,一个或几个&nb

#rabbitmq    #集群    #消息队列    #分布式   



京ICP备15018585号