一、在任务与执行策略之间的隐性解耦
有些类型的任务需要明确地指定执行策略,包括:
. 依赖性任务。依赖关系对执行策略造成约束,需要注意活跃性问题。要求线程池足够大,确保任务都能放入。
. 使用线程封闭机制的任务。需要串行执行。
. 对响应时间敏感的任务。
. 使用ThreadLocal的任务。
1. 线程饥饿死锁
线程池中如果所有正在执行任务的线程都由于等待其他仍处于工作...
分类:
编程语言 时间:
2014-06-05 06:15:57
阅读次数:
355
什么是线程安全性:要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的和可变的状态的访问。“共享”意味着变量可以由多个线程同时访问,而“可变”则意味着变量的值在其生命周期内可以发生变化。一个对象是否需要线程安全的,取决于他是否被多个线程..
分类:
编程语言 时间:
2014-05-27 03:32:21
阅读次数:
256
java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:写道给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。
静态变量:线程非安全。静态变量即类变量,位于方法区,为所有对...
分类:
编程语言 时间:
2014-05-26 13:30:48
阅读次数:
467
一、什么是线程安全性
编写线程安全的代码
核心在于要对状态访问操作进行管理。
共享,可变的状态的访问 - 前者表示多个线程访问, 后者声明周期内发生改变.
线程安全性
核心概念是正确性。某个类的行为与其规范完全一致。
多个线程同时操作共享的变量,造成线程安全性问题。
* 编写线程安全性代码的三种方法:
不在线程之间共享该状态变量
将状态变量修改为不可变的变量
在访问...
分类:
编程语言 时间:
2014-05-26 05:31:40
阅读次数:
282
一、同步容器类
1. 同步容器类的问题
线程容器类都是线程安全的,但是当在其上进行符合操作则需要而外加锁保护其安全性。
常见符合操作包含:
. 迭代
. 跳转(根据指定顺序找到当前元素的下一个元素)
. 条件运算
迭代问题可以查看之前的文章
《Java ConcurrentModificationException 异常分析与解决方案》
二、并...
分类:
编程语言 时间:
2014-05-25 11:09:47
阅读次数:
331
一、设计线程安全的类
在设计线程安全类的过程中,需要包含以下三个基本要素:
. 找出构成对象状态的所有变量。
. 找出约束状态变量的不变性条件。
. 建立对象状态的并发访问管理策略。
分析对象的状态,首先从对象的域开始。 变量按作用域划分:
. 全局变量
. 局部变量
. 方法行参
. 异常处理参数
1. 收集同步需求
如果不了解对象的不变性条件...
分类:
编程语言 时间:
2014-05-25 08:41:05
阅读次数:
290
一、可见性
什么是可见性?
Java线程安全需要防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且需要确保当一个线程修改了对象的状态后,其他线程可以看到发生的状态变化。 后者就是可见性的描述即多线程可以实时获取其他线程修改后的状态。
*** 待补充 两个工人同时记录生产产品总数问题
1. 失效数据
可见性出现问题就是其他线程没有获取到修改后的状态,更直观...
分类:
编程语言 时间:
2014-05-24 22:17:11
阅读次数:
246
进程(Process)和线程(Thread)是程序运行的两个基本单元。Java并发编程更多的是和线程相关。
进程
进程是一个独立的执行单元,可将其视为一个程序或应用。然而,一个程序内部同事还包含多个进程。Java运行时环境就是一个单独的进程,在它内部还包含了作为进程的各种类和程序。
线程
可以将线程看做轻量级的进程。线程存在于进程当中,需要的资源开销较小。同一进程中的线程共...
分类:
编程语言 时间:
2014-05-23 00:16:01
阅读次数:
372
Subsections
线程安全(Thread safety)
锁(lock)
共享对象
对象组合
基础构建模块
任务执行
取消和关闭
线程池的使用
性能与可伸缩性
并发程序的测试
显示锁
原子变量和非阻塞同步机制
一、线程安全(Thread safety)
无论何时,只要多于一个线程访问给定的状态变量。而且其中某个线程会写入该变量,此时必须使用同...
分类:
编程语言 时间:
2014-05-21 17:11:45
阅读次数:
500
当客户端请求速度远远大于服务端的处理速度,这时候就非常适合使用GuardedSuspention模式packagecn.fcl.guardendSuspension;
importjava.util.ArrayList;
importjava.util.List;
publicclassRequestQueue{
privateList<Integer>integers=newArrayList<Integer>();
..
分类:
编程语言 时间:
2014-05-15 09:08:21
阅读次数:
283