![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发多线程
-
踟蹰千年
希望能一直有码编的码农一枚
展开
-
死锁详解及死锁的处理策略
一.什么是死锁在多线程并发中两个或多个线程互相持有对方所需要的资源,不主动释放,在没有外力干预的情况下,所有人都无法继续前进,导致程序陷入无尽的阻塞,就是死锁比如下图,线程A 线程B都尝试获取对方持有的锁,但是又不释放自己所持有的锁就会陷入死锁如果多个线程间的依赖关系是环形,存在环路的锁依赖关系,那么也有可能会发生死锁死锁一旦发生可能会造成系统崩溃,在高并发场景中,影响大量...原创 2020-02-02 22:56:42 · 2613 阅读 · 0 评论 -
(一)并发理论知识
1.同步和异步同步代表程序执行一个请求,知道请求完成,再处理下一个请求异步代表程序执行一个请求,会直接返回,会单独开一个线程让这个请求执行,同时执行下一个请求,并不一定等请求完成再处理下一个请求2.并发和并行并行就是多个线程一起进行并发就是一个线程轮流执行3.临界区4.阻塞和非阻塞5.死锁、饥饿、活锁死锁,就是指线程之间相互阻塞,如图中小汽车,A必须等B执行,B必须等C执行完,C必须等D执行完,D...原创 2018-07-09 22:45:36 · 654 阅读 · 0 评论 -
线程基础(十三)线程池
转自http://www.cnblogs.com/dolphin0520/p/3932921.html如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这...原创 2019-01-28 11:04:40 · 127 阅读 · 0 评论 -
线程基础(十二)线程组
线程组可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式,如图所示: 线程组的作用是:可以批量管理线程或线程组对象,有效地对线程或线程组对象进行组织。 线程关联线程组:1级关联所谓1级关联就是父对象中有子对象,但并不创建孙对象。这种情况在开发中很常见,比如创建一些线程时,为了有效对这些线程进行阻止管...原创 2019-01-24 14:34:53 · 222 阅读 · 1 评论 -
线程基础(十一)Timer
定时/计划功能在Java应用的各个领域都使用得非常多,比方说Web层面,可能一个项目要定时采集话单、定时更新某些缓存、定时清理一批不活跃用户等等。定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程方式进行处理,所以它和多线程技术关联还是相当大的。 Timer的schedule(TimeTask task, Date time)的使用该方法的作用是在执行的日期执...原创 2019-01-23 17:08:02 · 237 阅读 · 0 评论 -
线程基础(十)生产者/消费者模式 进阶 利用await()/signal()实现
利用await()/signal()实现生产者和消费者模型一样,先定义一个缓冲区:/* * 缓冲区 */public class Buffer { public static String buffer="";}package a_reentrantlock;import java.util.concurrent.locks.Condition;import jav...原创 2019-01-23 09:34:32 · 388 阅读 · 0 评论 -
线程基础(九)ReentrantReadWriteLock ,synchronized和ReentrantLock的对比
读写锁ReentrantReadWriteLock概述大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务),但是效率非常低。所以在JDK中提供了一种读写锁ReentrantReadWriteLock,使用它可以加快运行效率。读写锁表示两个锁,一个是读操作相关的锁,称为共享锁;另一个是写操作相关的锁...原创 2019-01-22 17:25:32 · 926 阅读 · 1 评论 -
线程基础(八)Reentrantlock重入锁
ReentrantLockReentrantLock,一个可重入的互斥锁,它具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。ReentrantLock基本用法/** * 重入锁 */public class ReentrantLockTest { int count =0; public static void mai...原创 2019-01-18 17:34:49 · 252 阅读 · 0 评论 -
线程基础(七)wait()和notify() 的生产者/消费者模式
什么是生产者/消费者模型一种重要的模型,基于等待/通知机制。生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点:1、生产者生产的时候消费者不能消费2、消费者消费的时候生产者不能生产3、缓冲区空时消费者不能消费4、缓冲区满时生产者不能生产生产者/模型作为一种重要的模型,它的优点在于:1、...原创 2019-01-17 18:21:22 · 294 阅读 · 0 评论 -
线程基础(六)wait() notify() notifyAll()
轮询线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作。想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处理?一个办法就是,B线程while(i == 10000),这样两个线程之间就有了通信,B线程不断通过轮训来检测i == 10000这个条件。这样可以实现我们的需求,但是也带来了问题:CPU把...原创 2019-01-16 19:11:32 · 273 阅读 · 0 评论 -
线程基础(五)死锁
死锁单独写一篇文章是因为这是一个很严重的、必须要引起重视的问题。这不是夸大死锁的风险,尽管锁被持有的时间通常很短,但是作为商业产品的应用程序每天可能要执行数十亿次获取锁->释放锁的操作,只要在这数十亿次操作中只要有一次发生了错误,就可能导致程序中发生死锁,并且即使通过压力测试也不可能找出所有潜在的死锁。死锁的产生当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将...原创 2019-01-16 18:37:36 · 435 阅读 · 0 评论 -
线程基础 (五)无锁
无锁在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是vol...原创 2019-01-16 14:10:03 · 203 阅读 · 1 评论 -
线程基础 (四)Volatile可见性
Volatile实现变量可见性先看一个例子public class MyThread extends Thread{ private boolean isRunning=true; public boolean isRunning() { return isRunning; } public void setRunning(boolean isRunning) {...原创 2019-01-16 12:56:23 · 979 阅读 · 0 评论 -
线程基础 (三) synchronized锁 和 代码块锁
线程安全:当多个线程访问某一个类(对象或方法时),这个类始终都能表现出正确的行为,这个类就是线程安全的 synchronized:可以在任意对象或方法上加锁,加锁的这段代码叫做互斥区或者临界区例子:public class MyThread extends Thread{ private int count=0; @Override public void run() { co...原创 2018-08-14 11:26:33 · 445 阅读 · 0 评论 -
线程基础(二)线程的中断interrupt
JAVA中有3种方式可以终止正在运行的线程①线程正常退出,即run()方法执行完毕了②使用Thread类中的stop()方法强行终止线程。但stop()方法已经过期了,不推荐使用③使用中断机制interrupt()1.stop()方法stop()在java多线程中已经废弃1.stop()方法会导致释放锁的不良后果,数据不完整比如一个上锁了得方法:threadA...原创 2019-01-15 17:27:56 · 283 阅读 · 0 评论 -
线程基础(一)线程中的方法
Thread类中的实例方法从Thread类中的实例方法和类方法的角度讲解Thread中的方法,这种区分的角度也有助于理解多线程中的方法。实例方法,只和实例线程(也就是new出来的线程)本身挂钩,和当前运行的是哪个线程无关1、start()start()方法的作用讲得直白点就是通知"线程规划器",此线程可以运行了,正在等待CPU调用线程对象得run()方法,产生一个异步执行的效果p...原创 2019-01-15 14:24:32 · 292 阅读 · 0 评论