并发编程
并发编程
IT界的一只菜鸟
不为失败找借口,只为成功想办法
展开
-
Java并发编程之基础篇(八)——死锁
哲学家问题一提到死锁,很多人都会想到哲学家问题。假设有5个哲学家,围坐在一张圆桌旁,哲学家只做两件事,吃饭和思考。吃饭的时候需要使用两只筷子,但是每个哲学家面前只放了一支筷子,如果想吃饭,必须借用旁边哲学家的筷子。这个时候如何管理每个哲学家吃饭与思考的时机和顺序就变得很重要。如果每个哲学家,拿起自己面前的筷子的时候,发现旁边的筷子不可用时,并不是释放手里筷子,而是死等旁边的筷子,就会发生死锁。所有哲学家都会因为等待对方的筷子而饿死。死锁抽象模型多个线程相互持有彼此正在等待的锁而又不释放自己已经持有的原创 2020-06-12 11:12:58 · 173 阅读 · 0 评论 -
Java并发编程之基础篇(七)——取消及关闭
上一篇中我们注重讲了线程和任务的启动,所以如何启动线程和任务我们已经很清楚了,但是如何做到线程及任务安全的关闭及取消,也是有一定技巧的。取消任务大部分场景下,启动的任务都会按照计划正常的运行,然后结束。但是有些场景我们必须提前结束任务。比如用户发送了取消请求。超过了某个规定的时间。发生了某种错误。应用程序被关闭。Java里面取消任务的执行一般有两种方法。第一种方法,设置一个标志位,任务执行过程会检查该标志位,如果为true则结束任务。该方法对于执行阻塞调用的情况下会有缺陷,下面会详细说原创 2020-06-03 11:49:13 · 213 阅读 · 0 评论 -
Java并发编程之基础篇(六)——Executor框架及线程池
这篇主要说一下Executor框架及线程池。什么是线程池顾名思义,线程池就是存放线程的池子,池子里面存放的是已经创建好的N个线程;Java里面一般用List或Set等容器类来存储线程,实现线程池功能。为什么要使用线程池首先,线程的创建和销毁是很耗费时间和资源的一件事情。其次,线程不能无限制的创建,每个线程都会占用内存资源,而且如果线程过多,线程之间的调度也是一件很消耗系统性能的事情。线程池带来的好处可以做到随用随取,节省因创建线程而花费的时间通过设置线程池容量,可以保证创建的线程数量在一个合原创 2020-06-03 11:40:12 · 211 阅读 · 0 评论 -
Java并发编程之基础篇(五)——闭锁、栅栏、信号量
Java并发编程之基础篇(五)——闭锁、栅栏、信号量闭锁——CountDownLatch闭锁类似于一道大门,所有的线程都在大门外等候,当大门打开时,所有线程一起开工。CountDownLatch提供了一个构造函数,可以传入一个整数作为参数,表示初始计数器。每调用一次countDown()方法时,计数器减一,当计数器减到0时,表示大门开放。可以把CountDownLatch想象成赛车的倒计时计数器,当计数器为0时,所有赛车加速驶出。下面我们通过开发一个简单的压力测试小工具来演示CountDownLat原创 2020-05-27 11:13:25 · 246 阅读 · 0 评论 -
Java并发编程之基础篇(四) -- 线程间的协作
Java并发编程之基础篇(四) – 线程间的协作这篇介绍一下线程之间如何进行通信之前介绍的内容都是如何保证线程之间的运行互不干扰,但是有的时候,线程之间必须互相合作。比如清洗盘子完成之后,才能对盘子进行烘干操作,烘干必须在清洗之后,那么清洗线程和烘干线程如何进行沟通呢?Java进程间的通信与访问共享变量一样,都需要借助互斥的特性来实现,在互斥的基础上,JDK为线程提供了一种自我挂起的能力。也就是说想实现进程间的通信,前提必须是在synchronized同步块或者方法中实现。实现互斥同步机制,Java原创 2020-05-22 10:44:15 · 252 阅读 · 0 评论 -
Java并发编程之基础篇(三) -- ThreadLocal
Java并发编程之基础篇(三) – ThreadLocalThreadLocal介绍上篇文章讲到,如果想在多线程的环境下,实现共享可变资源的安全访问,最好的方式是加锁,也就是同一时刻只有一个线程在使用共享可变资源。如果我们有一种方式可以根除对变量的共享,那么就可以实现不加锁的情况下对变量进行安全访问。还拿之前抢卫生间坑位的例子举例,如果只有一个卫生间坑位,五个人都想去卫生间的话,那么就需要加锁同步。如果给每个人都提供一个单独的坑位,那么就可以不加锁了,因为没有争抢的场景发生。Java通过Thread原创 2020-05-22 10:28:49 · 201 阅读 · 0 评论 -
Java并发编程之基础篇(二) -- 锁
Java并发编程之基础篇(二)上一篇基础篇介绍了并发编程最基本的东西。这篇说一下多线程如何正确的访问共享可变资源。所谓的共享可变资源就是每个线程都可以读也都可以写的资源。如何让多个线程正确的修改以及读取共享变量是一门学问。问题引入如下段代码实现了一个线程计数器功能,也就是统计一下有多少个线程执行了任务。首先定义一个任务public class Task implements Runnable { public static int count = 0; public void原创 2020-05-22 10:03:38 · 205 阅读 · 0 评论 -
Java并发编程之基础篇(一)-- 线程与任务
Java并发编程之基础篇进程和线程理解提到并发编程,很多人会想到多线程;希望让多个线程共同完成一项任务,以提高生产效率。所以要聊并发编程之前,就要先说一下什么是线程,要说什么是线程就需要说一下什么是进程。进程:在现代操作系统中,每一个独立运行的程序都是一个进程,比如运行中的word,微信等等都是一个独立进程。线程:在现代操作系统中,线程也叫轻量级进程,每个进程里面可以包含多个线程。CPU资源可以在多个线程之间不断切换,仿佛所有线程在并行执行。每个线程都有自己的计数器,堆栈,和局部变量等属性。这原创 2020-05-22 09:48:33 · 606 阅读 · 0 评论