自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 并发编程---性能与可伸缩性

线程的最主要目的是提高程序的运行性能,但性能的提升会导致复杂性的提升,又会导致安全性和活跃性的风险 一、对性能的思考提升性能意味着用更少的资源做更多地事情。要想通过并发来获得更好的性能,就要更有效地利用现有处理资源线程使用的额外的性能开销:线程之间的协调(例如加锁、触发信号以及内存同步等),增加的上下文切换,线程的创建和销毁,以及线程的调度等1、性能与可伸缩性(多块vs多少)性能通过服务时间、...

2018-06-25 23:35:13 201

原创 并发编程----避免活跃性的危险

安全性和活跃性之间存在某种制衡: 使用加锁机制来确保线程安全,但如果过度使用加锁,则可能导致锁顺序死锁(Lock-Ordering Deadlock)。同样,使用线程池和信号量来限制对资源的使用,但这些被限制的行为可能会导致资源死锁(Resource Deadlock)10.1 死锁经典的“哲学家进餐”问题很好地描述了死锁状况。 5个哲学家围坐在一个圆桌上,每两个哲学家之间都有一只筷子,哲学...

2018-06-23 20:02:48 259

原创 并发编程---线程池的使用

一、在任务和执行策略之间隐性耦合Executor框架将任务的提交和它的执行策略解耦开来。虽然Executor框架为制定和修改执行策略提供了相当大的灵活性,但并非所有的任务都能适用所有的执行策略。依赖性任务:依赖其他同步任务的结果,使其不得不顺序执行,影响活跃性使用线程封闭的任务:在单线程的Executor中执行,任务可以不是线程安全的,但是一旦提交到线程池时,就会失去线程安全对响应时间敏感的任...

2018-06-21 23:12:32 174

原创 并发编程---取消与关闭

Java没有提供任何机制来安全地终止线程(虽然Thread.stop和suspend方法提供了这样的机制,但由于存在缺陷,因此应该避免使用中断:一种协作机制,能够使一个线程终止另一个线程的当前工作立即停止会使共享的数据结构处于不一致的状态,需要停止时,发出中断请求,被要求中断的线程处理完他当前的任务后会自己判断是否停下来 一、任务取消若外部代码能在某个操作正常完成之前将其置入“完成”状态,则还...

2018-06-20 22:08:43 166

原创 并发编程---任务执行

任务:通常是一些抽象的且离散的工作单元。大多数并发应用程序都是围绕"任务执行"来构造的,把程序的工作分给多个任务,可以简化程序的组织结构便于维护 一、在线程中执行任务任务的独立性:任务并不依赖于其他任务的状态,结果和边缘效应。独立的任务可以实现并行执行1、串行的执行任务所有的任务放在单个线程中串行执行,程序简单,安全性高,不涉及同步等情况,缺点也显而易见,无法提高吞吐量和响应速度,适合任务数量...

2018-06-19 21:39:44 177

原创 并发编程---- 基础构建模块

委托是创建线程安全类的一个最有效的策略:只需让现有的线程安全类管理所有的状态即可。一、同步容器类1、同步容器类的问题  同步容器类都是线程安全的,容器本身内置的复合操作能够保证原子性,但是当在其上进行客户端复合操作则需要额外加锁保护其安全性  由于同步容器类要遵守同步策略,即支持客户端加锁,但必须清楚加入同一个锁2、迭代器与ConcurrentModificationException  及时...

2018-06-18 12:06:53 187

转载 并发编程----对象的组合

4.转载地址https://blog.csdn.net/ahaha413525642/article/details/766170191 设计线程安全的类在设计线程安全类的过程中,需要包含下面三个基本要素 ①找出构成对象状态的所有量 ②找出约束状态变量的不变性条件 ③建立对象状态的并发访问管理策略要访问对象的状态,首先从对象的域开始。如果对象中所有的域都是基本类型的变量,那么这些域将构成对象的...

2018-06-16 21:08:00 235

原创 并发编程---对象的共享

一、可见性重排序:在没有同步的情况下,编译器、处理器可能对代码的执行顺序进行一些调整例如如下代码,由于没有使用同步机制,读线程可能看不见ready的修改,而一直循环下去;也可能由于重排序,看到了ready的修改number仍没修改而输出01、失效数据在缺少同步的程序中产生错误的结果的一种情况。造成程序的不确定性。2、非原子的64位操作即使是失效数据也是程序过去运行中产生的数据。但执行非原子的6...

2018-06-14 23:43:22 103

原创 并发编程----线程安全性

编写线程安全的代码的核心是要对状态访问操作进行管理,尤其是对共享的和可变的状态访问。 这里的对象的状态可以看成是存储在状态变量(例如实例或静态域)中的数据。1.什么是线程安全线程安全性定义中最核心的是概念是正确性。 正确性的含义是:某个类的行为和规范完全一致。在良好的规范中通常会定义各种不变性条件来约束对象,以及定义各种后验条件来描述对象操作的结果。 在正确性定义的基础上,线程安全性的定...

2018-06-12 20:45:09 141

原创 设计模式---状态模式

public class GumballMachine { final static int SOLD_OUT = 0; final static int NO_QUARTER = 1; final static int HAS_QUARTER = 2; final static int SOLD = 3; ...

2018-06-11 22:05:55 111

原创 设计模式---迭代器与组合模式

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示。这个模式提供了一种方法,可以顺序访问一个聚合对象中的元素,而不用知道内部怎么表示的。为了更好的理解迭代器模式,我们举个例子。下面使用head first设计模式中的例子,使用迭代器模式来演示早餐和晚餐菜单的显示。由于早餐和晚餐其数据结构不同,由于早餐店和晚餐店需要合并,所以需要一个统一的菜单:即菜单项结构相同。下面...

2018-06-10 21:48:01 211

原创 设计模式---模板方法模式

模板方法模式(TEMPLATE METHOD),用于定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,属于类行为型模式。模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称...

2018-06-10 19:25:23 103

原创 设计模式---适配器模式和外观模式

适配器模式(Adapter)适配器(adapter-pattern):将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。两种形式:对象适配器(组合)类适配器(多重继承):在Java中不能实现外观(facade-pattern):提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。原则     最少知识原则:只和你的密友...

2018-06-09 14:13:39 158

原创 设计模式---命令模式

Command:        定义命令的接口,声明执行的方法。ConcreteCommand:       具体的命令, 实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。Receiver:        接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。Invoker:        要求命令对象执行请求,通常会持有命令对...

2018-06-07 23:56:09 109

原创 设计模式---单件模式

单件模式确保一个类只有一个实例,并提供一个全局访问点。有一些对象我们只需要一个,比方说:线程池、缓存、对话框、处理器偏好设置和注册表的对象等等。事实上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源使用过量,或者是不一致的结果。使用静态变量如何确保这些类只存在一个实例?利用java的静态变量可以做到,但使用静态变量有个缺点:如果将对象赋值给一个全局...

2018-06-07 19:46:45 99

原创 设计模式---工厂模式

工厂模式:当代码中有很多具体类的创建,可能就有问题。像下面这段代码,就有很多实例创建,当哪天需要修改,就要改动源码。这对代码的维护和更新代价较大。Duck duck;if (pinic) { duck = new MallardDuck();} else if (hunting) { duck = new DecoyDuck();} else if (inBathTub) { d...

2018-06-06 20:43:55 143

原创 设计模式---装饰者模式

这样的订单系统没有办法考虑到咖啡调料的部分,把加入不同调料的咖啡看做不同的类会导致类爆炸(每个类的cost方法计算出咖啡加调料的价钱):很明显,这样的系统难以维护,一旦牛奶的价钱上扬或新增一种焦糖调料,系统将难以改变。采用实例变量和继承的设计也许能解决一些问题:Beverage作为一个饮料类,加上实例变量代表是否加入了饮料。然而当用户想要双倍摩卡咖啡时,这样的系统就显得有些无所适从。对于冰茶,...

2018-06-06 13:21:14 124

原创 设计模式---观察者模式

为什么观察者模式会出现呢?为了建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是为什么需要观察者模式。观察者模式(Observer Pattern):定义了对象之间的一种...

2018-06-05 23:24:55 100

原创 设计模式----策略设计模式

什么是策略模式: 策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。让鸭子能飞去年,公司的竞争力加剧,公司主管认为该是创新的时候了。主管认为,此模拟程序需要会飞的鸭子,将竞争者抛在后面。改变duck会叫不能飞的鸭子也飞起来。我们要使用其他方法。 改进继承Joe认识到继承可能不是一个好的解决办法,因为他刚刚拿到来自主管的备忘录,希望以后每六个月更...

2018-06-04 23:11:00 157

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除