Java并发编程
hai2024
一个安卓通信人。
展开
-
[Java并发编程实战] 共享对象之可见性
我们已经知道同步代码块和同步方法可以保证以原子的方式执行,其实,同步还有另外一个重要概念:内存可见性。换句话说,我们不仅希望防止某个线程正在使用对象状态而另一个线程同时在修改状态,而且希望确保当一个线程修改了对象的状态后,其他线程能够看到修改后的状态。可见性一个线程对共享变量值的修改,能够及时的被其他线程看到。Java 内存模型(JMM,Java Memory Model)...原创 2018-05-19 00:07:54 · 849 阅读 · 1 评论 -
[Java并发编程实战]什么是锁顺序死锁
精诚所至,金石为开。———《后汉书·广陵思王荆传》 意思是人的诚心所到,能感动天地,使金石为之开裂。比喻只要专心诚意去做,什么疑难问题都能解决。锁顺序死锁两个线程试图通过不同的顺序获取多个相同的锁。如果请求的顺序不相同,那么会出现循环的锁依赖现象,产生死锁。但是如果保证同时请求锁L和锁M的每一个线程,都是按照从 L 到 M 的顺序,那么就不会发生死锁了。举个例子说明一下,...原创 2018-06-30 00:07:17 · 1015 阅读 · 0 评论 -
[Java并发编程实战]协作对象之间存在的死锁问题
百川东到海,何日复西归?少壮不努力,老大徒伤悲。———《汉乐府·长歌行》 河水东流不复返就如时间的流逝不可能停留,告诫我们年少时如果不珍惜时间努力向上,到老只能白白地悔恨自己与悲伤了。上文讲解了锁顺序死锁发生的情况,但是还存在一些死锁的情况,不是顺序锁那么简单可以被发现。因为有可能并不是在同一个方法中显示请求两个锁,而是嵌套另一个方法去获取第二个锁。我们举个例子来说明,下面代...原创 2018-06-30 11:32:43 · 2842 阅读 · 0 评论 -
[Java并发编程实战]管理 Executor 生命周期的几个方法
前文说了 Exectuor 的具体用法,却没有说到如何停止一个任务的执行。所以,本篇文章就来讲解一下 Executor 的生命周期管理。首先,看下这个框架生命周期相关的主要方法。void shutdown();//平缓关闭List<Runnable> shutdownNow(); //强制关闭boolean isShutdown(); //是否关闭boolean is...原创 2018-06-25 21:40:56 · 810 阅读 · 0 评论 -
[Java并发编程实战] 线程池的使用之饥饿死锁的发生
一屋不扫何以扫天下?———《后汉书·陈蕃传》 这句话的意思是,从一点一滴的小事开始积累,才能做成一番大事业。Executor框架核心之一就是利用线程池,所以接下来这几篇,详细介绍线程池相关的高级选项以及注意事项。任务间隐性耦合的说明虽说 Exectuor 将任务和执行策略解耦,但是实际上言过其实了。假如任务之间存在某种相互依赖关系,其中一个任务必须依赖另外一个的执行,这就...原创 2018-06-26 23:54:21 · 1625 阅读 · 1 评论 -
[Java并发编程实战]线程池的饱和策略
有志者,事竟成。———《后汉书·耿弇传》 一个有志气的人,做事情是一定会成功的!通常情况下,线程池会判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。但是如果有限队列已经满了,则会交给饱和策略来处理这个任务。ThreadPoolExecutor 的饱和策略可以通过调用 setRejectedExecutionHandler 来修改。JDK 提供了...原创 2018-06-28 00:02:33 · 1955 阅读 · 0 评论 -
[Java并发编程实战]活锁
我们都知道死锁,然而还存在一种锁叫做活锁。死锁是一直死等,活锁他不死等,它会一直执行,但是线程就是不能继续,因为它不断重试相同的操作。换句话说,就是信息处理线程并没有发生阻塞,但是永远都不会前进了。活锁同样会发生在多个相互协作的线程间,当他们为了彼此间的响应而相互礼让,使得没有一个线程能够继续前进,那么就发生了活锁。好比两个过于礼貌的人在半路相遇,出于礼貌他们相互礼让,避开对方的路,但是在...原创 2018-07-10 20:53:55 · 7390 阅读 · 5 评论 -
[Java并发编程实战]显示锁Lockh和ReentrantLock
Lock 和 ReentrantLock与内部加锁不同,Lock 提供了无条件的、可轮询的、定时的、可中断的锁获取操作,所有加锁和解锁的方法都是显示的。Lock的实现必须提供具有与内部加锁相同的内存可见性的语义。但是加锁的语义,调度算法,顺序保证,性能特性这些可以不同。public interface Lock { void lock(); void lockInter...原创 2018-07-10 23:17:07 · 346 阅读 · 0 评论 -
[Java并发编程实战]状态依赖性的管理之阻塞队列的实现(一)
人生自古谁无死,留取丹心照汗青。———文天祥《过零丁洋》 这两句诗的意思,是说自古以来,人终不免一死!但死得要有意义,倘若能为国尽忠,死后仍可光照千秋,青史留名。 类库本身包含了许多存在状态依赖性的类。如FutureTask,BlockingQueue等。这些类中的一些操作,会基于状态的前提条件。比如,不能从一个空的队列删除元素或获取一个尚未结束的任务的计算结果。这两个操作执行之...原创 2018-07-18 21:33:32 · 331 阅读 · 0 评论 -
[Java并发编程实战]状态依赖性的管理之阻塞队列的实现(二)
明日复明日,明日何其多?我生待明日,万事成蹉跎。———《明日歌》 这句诗给人的启示是:世界上的许多东西都能尽力争取和失而复得,只有时间难以挽留。人的生命只有一次,时间永不回头。反复告诫人们要珍惜时间,今日的事情今日做,不要拖到明天,不要蹉跎岁月。上一篇遗留的问题: 有没有某种方法可以达到,当条件为真时,线程立即醒过来执行呢?答案是肯定的。所以,来看第三种方法,代码清单如下...原创 2018-07-21 07:01:44 · 319 阅读 · 1 评论 -
[Java并发编程实战]构建一个高效可复用缓存程序(含代码)
这几天更新了这么多篇文章,其实这些都是并发编程中最基础的知识。现在,我们是时候利用这些知识来写一个小程序了。本篇文章就来介绍如何构建一个用来存储计算结果的高效、可伸缩高速缓存,虽然简单,但也可以说算是对前面知识的一次运用了。高速缓存,无论是在服务器端还是在前端程序中都有不同形式机制的实现。复用缓存里的结果可以大大缩短程序的等待时间,提高吞吐量。说的通俗一点就是利用空间换时间。在本篇文章中,将一...原创 2018-06-08 23:37:10 · 947 阅读 · 1 评论 -
[Java并发编程实战] Executor 框架几个常见的实现类介绍(含示例代码)
上一篇文章已经讲了 Executor 的整体框架,其中有提到它的执行的示意流程图。这篇文章就介绍几个常见的实现类的原理和用法,最后通过示例代码,打印 log 来明确它们的执行流程。常见实现类介绍FixedThreadPool 详解SingleThreadExecutorCachedThreadPool代码示例newFixedThreadPool 示例``...原创 2018-06-22 23:14:05 · 718 阅读 · 0 评论 -
[Java 并发编程实战] 集合框架之 同步容器类 & 并发容器类
通过上一篇文章,我们已经知道设计一个线程安全类的原则和步骤,以及在设计过程中我们应当注意的细节。实际上,Java 的集合库包含了线程安全集合和非线程安全集合,可以说 Java 的线程安全集合就是按照上一篇的步骤来实现的。这篇主要简单介绍 Java 集合库。它包含的集合可以区分为:非同步集合同步集合并发集合那么,它们分别包括哪些具体的集合类,它们有什么主要的区别,以及它们的框架是...原创 2018-05-25 07:55:41 · 365 阅读 · 0 评论 -
[Java 并发编程实战] 对 volatile 变量进行实例验证(内含源码)
Volatile 变量,在上一篇文章已经有简单提及相关概念和用法。那么,这一篇主要对 Volatile 变量的特性进行验证,直接上源码。验证它的三个特性:可见性非原子性重排序volatile 之可见性验证上一篇文章中,讲到 volatile 变量通常被当做状态标记使用。典型的应用是,检查标记状态,以确定是否退出循环。在这里,我们直接举个反例,源码如下:public cl...原创 2018-05-21 20:11:26 · 516 阅读 · 0 评论 -
[Java 并发编程实战] 同步容器类潜在的问题(含实例代码)
同步容器类存在的问题同步容器类包括HashTableVectorStack同步包装器 : [ Collections.synchronizedMap(), Collections.synchronizedList() ]从同步容器的源码可以看出,它们将状态封装起来,并对每个方法都采用 synchronized 进行了同步,每次只有一个线程能访问容器。这种方式的同步机制很显然会...原创 2018-05-26 09:54:03 · 402 阅读 · 0 评论 -
[Java并发编程实战] 栅栏 CyclicBarrier 实现(含代码)
关卡原创 2018-06-04 07:56:45 · 1204 阅读 · 0 评论 -
[Java 并发编程实战] 设计线程安全的类的三个方式(含代码)
前面几篇已经介绍了关于线程安全和同步的相关知识,那么有了这些概念,我们就可以开始着手设计线程安全的类。本文将介绍构建线程安全类的方法,它们包括:实例封闭。线程安全性的委托。现有的线程安全类添加功能。在设计线程安全类的过程中,需要包含以下三个基本要素:找出构成对象状态的所有变量。找出约束状态变量的不变性条件。建立对象状态的并发访问策略。实例封闭将数据封装在对象...原创 2018-05-23 20:56:33 · 857 阅读 · 1 评论 -
[Java并发编程实战] Executor框架(含思维导图)
Executor 简介Executor 是一个简单的接口,但它却是整个异步任务执行框架的基础,这个框架能支持多种不同类型的任务执行策略。他提供了一种标准的方法将任务的提过过程和执行过程解耦开来,并用 Runnable 来表示任务。Executor 基于生产者-消费者模式,提交任务相当于生产者,执行任务的线程相当于消费者。同时,Executor 的实现还提供了对任务执行的生命周期管理的支持。...原创 2018-06-11 23:14:03 · 2089 阅读 · 1 评论 -
[Java并发编程] 用 信号量(Semaphore) 实现一个消息池(含代码)
欲穷千里目,更上一层楼。—唐·王之涣《登颧雀楼》 这句诗的意思是:想看到更远更广阔的景物,你就要再上一层楼。想学到更多更深的知识,你就要比原来更努力。Semaphore,计数信号量,用来控制同时访问某个特定资源的线程数量,需要我们设定它的最大访问数量。 Semaphore 管理着一组虚拟许可,许可的初始数量可以通过构造函数来指定。在执行操作时可以首先获取许可,并在使用后释放许可。...原创 2018-06-05 22:15:34 · 485 阅读 · 0 评论 -
[Java并发编程] 并发容器框架的简单介绍
>三军可夺帅也,匹夫不可夺志也。———《论语》上一篇讲到同步容器类的潜在问题,可以通过两个方法解决。可以通过客户端加锁解决。可以使用并发容器类来解决问题。客户端加锁的方法我们已经知道,所以,这一篇介绍一下并发容器类原理,看它是如何解决这些问题的。下面看下并发容器的框架图: 我们从上图可以看到,它们分为五大类:Map, List, Set,Collection,Qu...原创 2018-05-29 20:14:56 · 315 阅读 · 1 评论 -
[Java并发编程实战] Future+callable+FutureTask 闭锁机制(含示例代码)
FutureTask 也可以做闭锁,它是 Future 和 callable 的结合体。所以我们有必要来了解 FutureTask的继承关系。FutureTask 的继承关系类图先看 FutureTask 类的继承:public class FutureTask<V> implements RunnableFuture<V> 它继承自 Run原创 2018-06-06 22:31:28 · 896 阅读 · 1 评论 -
[Java网络编程一]TCP/IP协议介绍
TCP/IP 参考模型看完并发编程,接着继续看Java网络编程,不要停!下面是 OSI 参考模型和 TCP/IP 参考模型的比较。TCP/IP 参考模型吸取了网络分层的思想,但是对他的层次做了简化,并且在网络各层(除了主机-网络层外)都提供了完善的协议,这些协议构成了 TCP/IP 协议集,简称 TCP/IP 协议。 各层的协议如下所示:主机-网络层:实际上 TCP/IP 参...原创 2018-08-16 22:24:58 · 3586 阅读 · 0 评论