- 浏览: 11161 次
- 性别:
- 来自: 悉尼
最新评论
文章列表
第九章 - 并行数据结构
- 博客分类:
- Java多线程
在并行系统中,为了避免数据竞赛的产生,我们可以:
使用非同步的数据结构并自行添加同步机制代码
使用Java concurrency API 提供的数据结构
通常第二种方法是我们所推荐的。因为Java对这些数据结构已经做了优化
阻塞和非阻塞数据结构
Java concurrency API 提供了两种并行数据结构:
阻塞数据结构
非阻塞数据结构
并行数据结构实现的接口
BlockingQueue
Queue是一个线性数据结构,允许你往队列尾部插入数据并从头部取出数据。它是一个先进先出的数据结构。
Queue接口提供了以下方法:
往队列尾部插入元素
从队 ...
第八章 - Map与Collect模型
- 博客分类:
- Java多线程
使用流来收集数据
上一章中我们谈到流的重要特性:
流中的元素不是保存在内存中
流不能被重复使用
流是懒处理数据
流操作不能改变流数据源
流允许你把操作串联起来,因此一个操作的输出可以作为下一个操作的输入
Stream的 collect() 方法
collect() 方法允许你对流中的元素进行转换和分组来生成一个新的数据结构。有两个不同版本的 collect() 方法。
第一个版本接收以下三个函数作为参数:
Supplier:该方法创建一个中间数据类型对象。如果你使用串行流,那么该方法被调用一次。如果你使用并行流那么该方法会被调用多次并且每次调用必须生成一个新的对象
...
第七章 - 使用并行流
- 博客分类:
- Java多线程
流 (Streams) 是一个数据序列 (它不是一个数据结构),它允许你使用串行或并行方式采用一系列的操作来对数据进行过滤,转换,排序,缩减或收集成一个最终的对象。
Streams 有三个不同的组成部分:
数据源 source:数据源提供Stream所需的数据
一个或多个中间操作,中间操作生成另外一个流作为输出
一个终端操作生成一个对象,这个生成的对象可以是一个简单的对象或一个诸如数据,队列或哈希表。也可以有不产生任何结果的终端操作
Streams的数据源
Stream的数据源生成供Stream对象使用的数据。你可以从不同的源来生成数据流。例如,Collection接口在Ja ...
Java 7 引入了一个特殊的 executor 使用 Fork/Join 框架。Fork/Join 框架用来解决那些能使用分治算法解决的问题
Fork/Join 框架介绍
为了使用分治算法,你必须把一个问题分解成小问题。使用递归方法来重复相同的操作直到问题被细 ...
第五章 - 使用Phaser类
- 博客分类:
- Java多线程
Java 7 concurrency API 提供了Phaser类来执行那些能够被划分为不同阶段执行的任务。如果你有一个流程能够被清晰地分为几个步骤,这些步骤中,第一个步骤必须完成后才能开始第二个步骤,以此类推,那么你可以使用Phaser这个类来实现,Phaser类主要包括以下特性:
Phaser类必须知道它所要控制的任务数。Java称它为注册参与者。一个参与者能够在任何时候向phaser注册。
当任务完成一个阶段时,必须通知phaser。Phaser 会让这个任务进入睡眠直到所有参与者都完成了那个阶段。
在 phaser 内部使用一个整型字段来保存已经发生的阶段数
一个参与者能在 ...
在executor里,你可以运行以下两种任务:
基于Runnable接口的任务:该任务实现run()方法,但该方法不具返回值
基于Callable接口:该任务实现了call()接口并返回一个对象作为结果。call()接口返回的对象类型由Callable接口里的泛型参数决定。executor会返回一个Future接口实现类的对象。
Callable接口
Callable接口具有以下特性:
它有一个类型参数来决定call()方法返回对象的类型
声明了call()方法。当任务被executor执行时该方法会被调用。它必须具有返回值
call()方法能够抛出任何的checked异 ...
Executors的一些高级特性
取消任务
当你把任务发送给 executor 后,你可以选择取消这个任务的执行。使用 submit() 方法发送一个 Runnable 对象给一个executor,submit() 方法将返回一个实现了 Future 这个接口类的对象。你可以通过该类的 ...
Executor框架相比于传统的并发系统基础实现具有很多的优势。传统做法是实现一个Runnable接口的类,然后使用该类的对象来直接创建Thread实例。
这种做法有一些问题,特别是当你启动太多线程的时候,你可能降低了整个系统的 ...
并发系统中可能遇到的问题
Data race
一个线程写入的数据可能被另一个线程所覆盖
死锁
如果两个或多个线程同时等待共享资源,而这些共享资源又必须由彼此来释放。以下四个条件同时满足时就会造成死锁:
互斥性: ...
平时工作中比较少写多线程代码,有些生疏了。最近抽时间好好读了"Mastering Concurrency Programming with Java 8" 这本书。
针对每章以后会做一些笔记以便于自己日后复习。因为比较少写东西,写出来和自己理解的有可能有误差,如果有什么地方不对欢迎帮我指出来。
表结构
'CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8'
'CREATE TABLE `teacher` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoD ...
表结构
'CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8'
'CREATE TABLE `teacher` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB ...
一对多,多对一双向关联
- 博客分类:
- Hibernate
表结构:
'CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `group_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FK_e5f24mh6aryt9hsy99oydps6g` (`group_id`), CONSTRAINT `FK_e5f24mh6aryt9hsy99oydps6g` FOREIGN KEY (`group_id`) REFERENCES `t_group` ...
表结构
t_group表
'CREATE TABLE `t_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8'
t_user表
'CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, ...
Group 表
'CREATE TABLE `t_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8'
User表
'CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `user ...