重用可以节省我们进行开发和测试(测试比我们自己测严谨地多)的时间和其他各种成本. 但是,对一个线程安全类进行扩展的时候就需要思考一些问题. 比如我们熟知的线程安全类Vector,该类中对所有的公有方法提供了synchronized修饰以保证访问互斥与可见性. 但Vector毕竟是一个公有的结构,他对客户代码的不变性约束一无所知. 比如客户代码中对某个Vector对象连续调用了两次方法,虽然每次都是线程安全的,但这种复合操作并不是一个原子操作,它可能不满足我们的不变性约束,于是线程安全类变得"不安…
Java 类库中包括很多实用的"基础模块"类.通常,我们应该优先选择重用这些现有的类而不是创建新的类.:重用能减少开发工作量.开发风险(由于现有类都已经通过測试)以及维护成本.有时候,某个线程安全类能支持我们须要的全部操作,但很多其它的时候,现有的类仅仅能支持大部分的操作,此时就须要在不破坏线程安全的情况下加入一个新的操作. 如果我们须要一个线程安全的链表,他须要提供一个原子的"若没有则加入(Put-If-Absent)"的操作.同步的 List 类已经实现了大部分…
1.设计线程安全类的过程 设计线程安全类的过程就是设计对象状态并发访问下线程间的协同机制(在不破坏对象状态变量的不变性条件的前提下). (1)构建线程安全类的三个基本要素: 1)找出构成对象状态的所有变量:(确定状态变量的类型(共享.可变的.不可变的),针对不同类型的状态变量采用不同的并发访问策略) 2)找出约束对象状态变量的不变性条件:(不变性条件本质上就是确定状态变量自身的约束条件和状态变量间的依赖关系) 对象状态变量的不变性条件与后验条件约束了在对象状态上有哪些状态和状态转换是有效的,也就…
一.线程安全类 当一个类已经很好的同步以保护它的数据时,这个类就称为线程安全的.当一个集合是安全的,有两个线程在操作同一个集合对象,当第一个线程查询集合非空后,删除集合中所有元素的时候,第二个线程也来执行与第一个线程相同的操作,也许第一个线程查询后,第二个也查出非空,但是此时明显是不对的.如: public class NameList { private List nameList = Collections.synchronizedList(new LinkedList()); public…
 Java视频扩展知识   线程池的了解 1.简单介绍: Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的问题提供了非常大的帮助. 2.线程池 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果 少了浪费了系统资源,多了造成系统拥挤效率不高. 用线程池控制线程数量,其他线程排队等候. 一个任务执行完毕,再从队列的中取最前面的任务开始执行. 若队列…
重用现有的类而不是创建新的类,可以降低工作量,开发风险以及维护成本. 有时候线程安全类可以支持我们所有的操作,但更多时候,现有的了类只能支持大部分的操作,此时就需要在不破坏线程安全性的情况下添加一个新的操作. 这里的例子:需要一个线程安全的链表,需要提供一个原子的"若没有则添加(Put-If-Absent)"的操作. 同步的List类已经实现了大部分功能,可以根据contains方法和add方法构造一个"若没有则添加"的操作. 修改原始类:不现实 另一个方法:继承这…
JAVA中有许多线程安全的基础模块类,一般情况下,这些基础模块类能满足我们需要的所有操作,但更多时候,他们并不能满足我们所有的需要.此时,我们需要想办法在不破坏已有的线程安全类的基础上添加一个新的原子操作.有如下4中方案: 1 修改类的源码,以添加新的原子操作 2 继承该线程安全类,并添加原子操作 3 使用客户端加锁方式 4 使用组合方式(推荐) 一般来讲,修改源码的方式不太可行,这样会破坏原有类的封装性而且有些时候,源码不可获得.我们从第二种方式开始举例: 假设现在对于类Vector,我们知道…
Java并发编程之-set集合的线程安全类 Java中set集合怎么保证线程安全,这种方式你知道吗? 在Java中set集合是 本篇是<凯哥(凯哥Java:kagejava)并发编程学习>系列之<并发集合系列>教程的第二篇: 本文主要内容:Set集合子类底层分别是什么?基于底层为什么set的子类可以存放一个数据?怎么解决set线程安全问题? 一:Set集合子类 Set的三个子类分别是:HaseSet.TreeSet.LinkedHashSet.这三个都是线程不安全的.那么这三个子类…
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间.别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据. 3) 如何在Java中实现线程? 在语言层面有两种方式.java.lang.Thread…
由于最近开始学习java,用到了线程池,按照之前c++的写法写出此java版的线程池 TaskRunnale实现相关任务的接口,具体要实现什么任务在相应的run函数中实现. package threadpool; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.List; import java.util.Queue; class TaskRunnale implements Runnable {…