itcats_cn的博客

学而不思则罔,思而不学则殆

用生活举例看Java多线程活跃性问题【死锁、饥饿、活锁】

死锁:吃饭问题,5个人每人只有一双筷子,只有让另外一个人分享他自己的筷子给自己,自己才能吃到饭。若存在这样的情况,若每个人都不把自己的筷子借给别人用餐,每个人都抓着自己手中的筷子不放,那么每个人都吃不上饭饿死了。也就是说A线程拥有B线程所需的资源,B线程也有A线程所需资源,但两者都不把资源分享出来...

2019-04-12 18:07:21

阅读数 23

评论数 0

什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁

什么是死锁 死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。例如,在某一个计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被...

2018-08-22 23:35:02

阅读数 84

评论数 0

Java多线程之守护线程与用户线程

 Java中有两种线程,一种是用户线程,另一种是守护线程。  用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止 守护线程当进程不存在或主线程停止,守护线程也会被停止。  使用Thread类中的setDaemon(true)方法设置为守护线程...

2018-08-22 15:46:21

阅读数 52

评论数 0

Java并发编程之happens-before

happens-before是JMM最核心的概念,理解happens-before是理解JMM的关键。 一.JMM的设计 首先,让我们先分析一下JMM的设计意图。从JMM的设计者的角度,在设计JMM的时候要考虑一下两个关键因素:   1.程序员对内存模型的使用。程序员希望内存模型易...

2018-08-02 20:36:09

阅读数 63

评论数 0

Java内存模型之重排序

在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 1. 在单线程环境下不能改变程序运行的结果; 2. 存在数据依赖关系的...

2018-08-02 19:27:45

阅读数 84

评论数 0

CopyOnWriteArrayList、ConcurrentLinkedQueue源码分析

一、CopyOnWriteArrayList CopyOnWrite思想: CopyOnWrite容器即写时复制的容器。通俗的理解是当往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新...

2018-08-01 17:03:07

阅读数 56

评论数 0

Java同步容器与并发容器

1、Java集合容器分类 在Java的集合容器框架中,主要有五大类别:Set、List、Queue、Map、Deque、Map。 其中Set、List、Queue、Map、Deque接口分别继承了Collection,Collection和Map是一个顶层接口。 Set: ...

2018-08-01 16:15:38

阅读数 69

评论数 0

Fork/Join框架及其性能介绍

欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 &amp...

2018-08-01 12:06:48

阅读数 186

评论数 0

Java并发之深入Future原理源码分析

JDK内置的Future主要使用到了Callable接口和FutureTask类。Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务。Callable接口可以看作是Runnable接口的补充,Callbale含有泛型,相...

2018-07-31 22:49:39

阅读数 621

评论数 0

Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的Reen...

2018-07-31 14:18:50

阅读数 124

评论数 0

Java并发编程工具类:CountDownLatch、CyclicBarrier、Semaphore

在jdk5中,java提供了一些非常有用的辅助工具类,包括CountDownLatch和CyclicBarrier(两者都可以实现线程之间的通信)、Semaphore(控制方法被线程访问的数量),他们三者都依赖于AQS实现,都是共享锁。今天我们就来学习一下这四个辅助类的用法。 1、CountDo...

2018-07-31 12:07:50

阅读数 129

评论数 0

Java多线程之ThreadLocal原理源码分析

什么是ThreadLocal? ThreadLocal 是线程的局部变量, 是每一个线程所单独持有的,其他线程不能对其进行访问, 通常是类中的 private static 字段,是对该字段初始值的一个拷贝,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联 我们知道有时候一个...

2018-07-30 15:23:50

阅读数 111

评论数 0

jdbc连接数据库6个步骤及手写实现简易的数据库连接池

我们在学习工作中可能常使用Hibernate、Mybatis、jpa等等框架,这些框架都对数据库连接池有很好的封装,可能忽略了数据库底层的实现,今天我们就一起来看看如何手写一个简易的数据库连接池,在此之前我们先回忆一下java连接数据库的步骤: 注册加载jdbc数据库驱动 第一,把驱动程序载入...

2018-07-30 13:48:09

阅读数 1614

评论数 0

java Condition源码分析

JUC提供了Lock可以方便的进行锁操作,但是有时候我们也需要对线程进行条件性的阻塞和唤醒,这时我们就需要condition条件变量,它就像是在线程上加了多个开关,可以方便的对持有锁的线程进行阻塞和唤醒。 Condition的概念 Condition主要是为了在J.U.C框架中提供和Java传...

2018-07-30 10:37:29

阅读数 74

评论数 0

Java多线程之Condition的使用及源码解析

java中条件变量都实现了java.util.concurrent.locks.Condition接口,条件变量的实例化是通过一个Lock对象上调用newCondition()方法来获取的,这样,条件就和一个锁对象绑定起来了。因此,Java中的条件变量只能和锁配合使用,来控制并发程序访问竞争资源的...

2018-07-29 23:17:35

阅读数 56

评论数 0

wait、notify、notifyAll解析

wait()、notify、notifyAll() 方法无法被重写,因为它们都是Object的本地final方法,每个对象都有锁,锁是每个对象的基础,当然操作锁的方法也是最基础了。   wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,...

2018-07-29 17:42:36

阅读数 70

评论数 0

ReentrantReadWriteLock源码与锁升降级详解

//读写锁 private ReadWriteLock lock =new ReentrantReadWriteLock(); //读锁 ————共享锁 private Lock readLock = lock.readLock(); //写锁 ————排它锁 p...

2018-07-28 23:15:36

阅读数 419

评论数 1

AQS原理与源码分析

AQS介绍 AQS,即AbstractQueuedSynchronizer, 队列同步器,它是Java并发用来构建锁和其他同步组件的基础框架。来看下同步组件对AQS的使用: AQS是一个抽象类,主是是以继承的方式使用。AQS本身是没有实现任何同步接口的,它仅仅只是定义了同步状态的获取和释放的方...

2018-07-28 18:05:55

阅读数 68

评论数 0

Java并发之实现一个可重入锁(使用Lock和AQS实现)

可重入锁指的是如果一个线程已经获得了一个锁,那么它可以多次进入这个锁,当然前提是线程需要先获得这个锁。 可重入锁是最常使用的锁,Java的内置锁就是可重入锁,使用synchronized关键字可以启用内置锁机制,比如说一个类有两个synchronized方法A和B,在A方法中调用了B方法,如果锁...

2018-07-28 11:58:36

阅读数 153

评论数 0

Java多线程中Lock接口解析

Lock是java.util.concurrent.locks包下的一个接口 主要方法有: Lock接口的实现类 Lock相关实现类还可以定义公平锁,如ReentrantLock(boolean)   package cn.itcats.thread.safe.Test1;...

2018-07-23 23:33:21

阅读数 61

评论数 0

提示
确定要删除当前文章?
取消 删除
关闭
关闭