05 2019 档案

摘要:前面介绍了线程的基本用法,以及多线程并发的问题处理,但实际开发中往往存在许多性质相似的任务,比如批量发送消息、批量下载文件、批量进行交易等等。这些同类任务的处理流程一致,不存在资源共享问题,相互之间也不需要通信交互,总之每个任务都可以看作是单独的事务,仿佛流水线上的原材料经过一系列步骤加工之后变为成 阅读全文
posted @ 2019-05-29 19:52 pinlantu 阅读(388) 评论(0) 推荐(0) 编辑
摘要:前面介绍了多线程并发之时的资源抢占情况,以及利用同步、加锁、信号量等机制解决资源冲突问题,不过这些机制只适合同一资源的共享分配,并未涉及到某件事由的前因后果。日常生活中,经常存在两个前后关联的事务,像雇员和雇主这两个角色,他们之间的某些工作就带有因果关系。比如要等雇主接到了项目,雇员才有活干;又如每 阅读全文
posted @ 2019-05-27 21:59 pinlantu 阅读(486) 评论(0) 推荐(0) 编辑
摘要:前面介绍了同步与加锁两种并发处理机制,虽然加锁比起同步要灵活一些,但是加锁在某些高级场合依然力有未逮,包括但不限于下列几点:1、某块代码被加锁之后,对其它线程而言就处于繁忙状态,缺乏弹性的阈值范围;2、遇到被其它线程加锁的情况,当前线程要么一直等待,要么立即放弃,除了这两种反应之外,没有别的选择了; 阅读全文
posted @ 2019-05-25 10:35 pinlantu 阅读(933) 评论(0) 推荐(0) 编辑
摘要:前面介绍了如何通过线程同步来避免多线程并发的资源冲突问题,然而添加synchronized的方式只在简单场合够用,在一些高级场合就暴露出它的局限性,包括但不限于下列几点:1、synchronized必须用于修饰方法或者代码块,也就是一定会有花括号把需要同步的代码给包裹起来。这样的话,花括号内外的变量 阅读全文
posted @ 2019-05-22 19:23 pinlantu 阅读(307) 评论(0) 推荐(0) 编辑
摘要:多个线程一起办事固然能够加快处理速度,但是也带来一个问题:两个线程同时争抢某个资源时该怎么办?看来资源共享的另一面便是资源冲突,正所谓鱼与熊掌不可兼得,系统岂能让多线程这项技术专占好处?果然是有利必有弊,且看之前演示售票任务时候的多线程操作,具体代码如下所示: 光光看代码感觉并无不妥之处,仅仅是起了 阅读全文
posted @ 2019-05-20 21:54 pinlantu 阅读(497) 评论(0) 推荐(0) 编辑
摘要:前面介绍了线程的几种运行方式,不管哪种方式,一旦调用了线程实例的start方法,都会立即启动线程的事务处理。然而某些业务场景在事务执行时间方面有特殊需求,例如期望延迟若干时间之后才开始事务运行,又如期望每隔若干时间依次启动事务处理,如此种种都要求在指定的时间才能启动线程任务,也就是俗称的定时功能。有 阅读全文
posted @ 2019-05-18 11:28 pinlantu 阅读(1019) 评论(0) 推荐(0) 编辑
摘要:前面介绍了如何利用Runnable接口构建线程任务,该方式确实方便了线程代码的复用与共享,然而Runnable不像公共方法那样有返回值,也就无法将线程代码的处理结果传给外部,造成外部既不知晓该线程是否已经执行完毕,也不了解该线程的运算结果是什么,总之无法跟踪分线程的行动踪迹。这里显然是不完美的,调用 阅读全文
posted @ 2019-05-15 19:18 pinlantu 阅读(971) 评论(0) 推荐(0) 编辑
摘要:前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小。注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后也单单执行该代码段而已。因而完全可以把这段代码抽出来,把它定义为类似方法的一串任务代码,这样能够像调 阅读全文
posted @ 2019-05-13 21:36 pinlantu 阅读(1247) 评论(0) 推荐(0) 编辑
摘要:每启动一个程序,操作系统的内存中通常会驻留该程序的一个进程,进程包含了程序的完整代码逻辑。一旦程序退出,进程也就随之结束;反之,一旦强行结束进程,程序也会跟着退出。普通的程序代码是从上往下执行的,遇到分支语句则进入满足条件的分支,遇到循环语句总有跳出循环的时候,遇到方法调用则调用完毕仍然返回原处,之 阅读全文
posted @ 2019-05-11 10:39 pinlantu 阅读(452) 评论(0) 推荐(0) 编辑
摘要:NIO不但引进了高效的文件通道,而且新增了更加好用的文件工具家族,包括路径组工具Paths、路径工具Path、文件组工具Files。先看路径组工具Paths,该工具提供了静态方法get,输入某个文件的路径字符串,输出该文件路径的路径对象Path。通过get方法获取路径对象的代码示例如下: 有了Pat 阅读全文
posted @ 2019-05-08 19:01 pinlantu 阅读(398) 评论(0) 推荐(0) 编辑
摘要:前面介绍了字节缓存的一堆概念,可能有的朋友还来不及消化,虽然文件通道的用法比起传统I/O有所简化,可是平白多了个操控繁琐的字节缓存,分明比较传统I/O更加复杂了。尽管字节缓存享有缓存方面的性能优势,但传统I/O也有缓存输入输出流呀,大家都有缓存机制,凭什么说NIO的文件处理更高效?之所以目前还看不出 阅读全文
posted @ 2019-05-06 21:14 pinlantu 阅读(303) 评论(0) 推荐(0) 编辑
摘要:前面介绍了文件通道的读写操作,其中用到字节缓存ByteBuffer,它是位于通道内部的存储空间,也是通道唯一可用的存储形式。ByteBuffer有两种构建方式,一种是调用静态方法wrap,根据输入的字节数组生成对应的缓存对象;另一种是调用静态方法allocateDirect,根据输入的数值分配指定大 阅读全文
posted @ 2019-05-03 10:49 pinlantu 阅读(558) 评论(0) 推荐(0) 编辑
摘要:前面介绍的各色流式IO在功能方面着实强大,处理文件的时候该具备的操作应有尽有,可流式IO在性能方面不尽如人意,它的设计原理使得实际运行效率偏低,为此从Java4开始增加了NIO技术,通过全新的架构体系带来了可观的性能提升。NIO是“Non-blocking IO”的缩写,意思是非阻塞的IO,与之相对 阅读全文
posted @ 2019-05-01 10:34 pinlantu 阅读(433) 评论(0) 推荐(0) 编辑