
Java并发编程的艺术
文章平均质量分 76
从_你的全世界路过
Look up at the stars,not down at your feet。
展开
-
Java并发编程基础---(10)重入锁---ReentrantLock
写在前面: 在之前的博客中,我们总结了队列同步器的方法,在这篇博客中,将会总结Lock的实现类ReentrantLock,在ReentrantLock类的内部,就有一个内部类,继承了我们之前讨论过的队列同步器,我们也一起来看看队列同步器的实际应用。 公平锁和非公平锁: 在讲解ReentrantLock类之前,我们先引入一个概念--公平锁和非公平锁。 我们可以想象一个场景,比...原创 2018-03-06 23:00:37 · 307 阅读 · 0 评论 -
Java并发编程基础---(8)控制并发编程数量的Semaphore总结
写在前面: 在前面两篇博客中,介绍了CountDownLatch、CyclicBarrier类的使用,这篇博客中,将会总结Semaphore类的使用,完善Java并发包中的3个工具类的使用总结。Semaphore Semaphore是用来控制程序中并发访问一个特定资源的线程数量,Semaphore通过协调各个线程,从而保证了资源的调度。Semaphore的构造器 我们来看一下JD...原创 2018-03-06 16:39:33 · 252 阅读 · 0 评论 -
Java并发编程基础---(9)Java中的锁---队列同步器
写在前面: 在这一篇博客中,将会介绍Java中的锁等相关内容,篇幅较长,会循序渐进的总结从队列同步器再到Lock接口的相关实现类。队列同步器: 队列同步器 (AbstractQueuedSynchronizer) ,是用来构建锁和其他同步组件的基础,从Java API中,我们可以看出,在AbstractQueuedSynchronizer类中,定义了一个int 类型的变量-...原创 2018-03-06 19:34:12 · 358 阅读 · 0 评论 -
Java并发编程基础---(15)Java死锁总结
写在前面: 死锁是进程死锁的简称,死锁是操作系统层面的一个错误,是进程死锁的简称,最早在 1965 年由 Dijkstra 在研究银行家算法时提出的是指多个进程循环等待他方占有的资源而无限的僵持下去的局面。很显然,没有外力作用,那么死锁涉及到的各个进程都将永远处于封锁状态。死锁的产生: 计算机系统产生死锁的根本原因就是资源有限且操作不当。 (1)一种原因是系统提供的资源太少了,远...原创 2018-03-14 15:29:07 · 281 阅读 · 0 评论 -
Java多线程面试问题总结
这篇博文总结一些面试之中Java多线程的一些关键问题。每一个问题,会简要介绍,一些问题,下面会附上详细的介绍博文链接,方便小伙伴们更好的学习和交流。谢谢大家。目录目录CASAQS自旋volatile关键字Volatile关键字CASCompare and Swap ,也就是比较和替换。假设有三个操作数:内存值V、旧的预期值A、要修改的值B。...原创 2018-08-28 18:17:00 · 367 阅读 · 0 评论 -
Java双重校验锁实现单例模式
目录目录写在前面代码实现问题分析写在前面 之前在博客中过一次Java设计模式-单例模式的2种实现方式(懒汉式+饿汉式)。 博文链接:Java设计模式—(1)单例模式 这2种实现,在单线程模式下,也不会出现线程安全问题,但是,如果在多线程环境下,就可能出现线程安全问题,所以我们要对之前的代码进行改进—-双重校验锁。代码实现 话不多说,咱们...原创 2018-08-29 11:45:04 · 18310 阅读 · 12 评论 -
Spring+TaskExecutor实现线程池管理
目录目录写在前面Spring配置信息线程池参数代码实现博客参考写在前面 线程池可以很好的帮助我们管理线程,它会预先创建若干数量的线程,并且不能由开发者直接对线程的创建进行控制,这样,消除了频繁创建和消亡线程的系统资源开销。 那么在Spring中,已经帮我们集成了线程池的功能,我们在项目中使用TaskExecutor类就可以实现线程池的管理。...原创 2018-08-29 20:37:19 · 2080 阅读 · 0 评论 -
HashMap为什么线程不安全?
put操作不安全resize操作不安全put操作不安全首先,我们都知道,HashMap的底层,是由一个Entry数组维护,数组中的每一个元素都存放着一个链表。当多线程情况下,我们进行put操作,例如:线程A: map.put("1",A);线程B: map.put("1",B);我们可以看到线程A、B分别进行了Put操作,经过hash计算之后,他们的key相同,...原创 2018-09-01 12:08:23 · 443 阅读 · 0 评论 -
Java并发编程基础---(7)CyclicBarrier同步屏障总结
写在前面: CyclicBarrier从字面上来看是指一道屏障,CyclicBarrier的作用是在一组线程到达屏障时,会被阻塞,直到最后一个线程到达屏障时,屏障才会开门,这时,被屏障拦截的线程才会继续运行。 CyclicBarrier构造器 public CyclicBarrier(int parties) { this(parties, null); }...原创 2018-03-06 13:31:05 · 247 阅读 · 0 评论 -
Java并发编程基础---(6)Java多线程的Join方法详解
写在前面: 在并发编程时,我们很容易会遇到输出一个数字的时候,可能得不到我们理想中的结果,那这是为什么呢?先让我们看一个最简单的例子。示例1:package test2;/** * * @ClassName Test1 * @Description:测试线程输出结果 * @author McGRADY * @date 2018年3月5日 */public class Te...原创 2018-03-05 22:48:03 · 297 阅读 · 0 评论 -
Java并发编程基础---(14)实现多线程的3种方式
写在前面: Java 实现多线程共有3种方式,第一种是继承Thread类,第二种是实现Runnable接口,而在Java5之后,又增加了第三种方式,实现Callable接口。继承Thread类:package createthread;public class Demo1 { public static void main(String[] args) { ThreadDemo th...原创 2018-03-12 22:33:35 · 217 阅读 · 0 评论 -
Java并发编程基础---(11)读写锁---ReadWriteLock
写在前面: Mutex(互斥锁)、ReentrantLock(重入锁)本质上都是一种排他锁,在同一时刻只允许一个线程进行访问,而读写锁允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程都会被阻塞。 ReadWriteLock:引入: 在JDK5之前,读写锁的实现,是利用了等待通知机制+synchronized关键字。等待通知机制可以让所有晚于写操作的读操作进入等待状...原创 2018-03-07 16:35:53 · 388 阅读 · 0 评论 -
Java并发编程基础---(12)线程的中断
写在前面: 之前在一篇博客中介绍了线程中断的相关内容(http://blog.youkuaiyun.com/may_3/article/details/79393281),在Java锁的实现中也有使用中断的地方,所以想用一篇博客再好好总结一下线程的中断。 中断:概念: 中断是线程的一个标识位属性,表示运行中的线程是否对其他线程进行了中断操作。其他线程是通过interrupt方法来中断线程。应...原创 2018-03-07 19:36:07 · 220 阅读 · 0 评论 -
Java并发编程基础---(13)wait和sleep的区别
写在前面: 在并发编程中,wait和sleep是常用的方法,相似却有着很大的区别,今天在博客中进行总结。我也是根据平常的并发编程经验和相关的博客总结了wait和sleep的区别,以及各自特点,肯定会有未想到的,希望大家帮忙留言补充,谢谢大家。wait是Object类的final方法,不可以被重写,而sleep方法时Thread类中静态、native修饰的本地方法。wait方法调用后,线程会释...原创 2018-03-07 19:42:16 · 306 阅读 · 0 评论 -
Java并发编程基础---(1)线程基础及线程调度
写在前面: Java的并发编程是Java语言很重要的一部分,最近自己在读《Java并发编程的艺术》这本书,所以会根据书中的内容,对Java并发编程的基础,深入等知识点,进行总结,梳理,希望会对大家的学习有所帮助。线程: 线程是操作系统调度的最小单元。启动一个Java程序,就会创建一个Java进程,在这个Java进程中,可以有多个线程,线程之间独享自己的计数器,栈,和局部变量等属性。此时...原创 2018-02-27 23:02:14 · 358 阅读 · 0 评论 -
Java并发编程基础---(2)线程通信机制
写在前面: 线程之间如果一直处于独立运行,并不会为我们的项目带来多大的价值,如果线程之间一直保持通信,则会带来巨大的的价值,而这篇博客将总结 volatile 和 synchronized 这两个维护线程之间通信的关键字。 volatile关键字 volatile用于修饰字段(成员变量),volatile的使用就是告诉线程对变量的访问,必须从共享内存中获取,而不会利用缓存,而且对...原创 2018-02-28 23:14:51 · 193 阅读 · 0 评论 -
Java并发编程基础---(3)CountDownLatch类总结
写在前面: CountDownLatch类在java.util.Concurrent包下在Java API中,是一个同步工具类,对CountDownLatch类的描述是允许一个或者多个线程等待,直到其他线程执行完后再执行。 CountDownLatch类可以使其他线程完成各自的工作后,再执行。比如:在应用程序中,main线程希望在所有框架服务的线程已经启动完所有框架服务之后...原创 2018-03-05 23:00:02 · 212 阅读 · 0 评论 -
Java并发编程基础---(5)线程池ThreadPoolExecutor的实现原理及使用
写在前面: Executor框架最核心的类是ThreadPoolExecutor,是线程池的实现类。 ThreadPoolExecutor继承了AbstractExecutorService接口。ThreadPoolExecutor ThreadPoolExecutor提供了4个构造方法。(1) public ThreadPoolExecutor(int corePoolSize...原创 2018-03-04 19:24:57 · 386 阅读 · 0 评论 -
阻塞队列实现生产者-消费者模式
代码实现如下:public class Test { private int queueSize = 10; private ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(queueSize); public static void mai原创 2018-09-10 16:31:22 · 903 阅读 · 0 评论