JAVA并发
一点一滴g
这个作者很懒,什么都没留下…
展开
-
Java线程安全
1.线程安全首先介绍一下Java语言中各种操作共享的数据,具体可分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。不可变“不可变”带来的安全性是最简单和最纯粹的。在Java中,如果一个共享数据是基本数据类型,那么只要在定义时使用final关键字修饰就可以保证它是不可变的。如果共享数据是一个对象,那就需要保证对象的行为不会对其状态产生任何影响,比如String类的对象,它...原创 2018-10-21 14:35:19 · 240 阅读 · 0 评论 -
Java并发简介
上图是我们在并发编程中需要着重注意的地方,希望大家能够有所收获。首先,我们先介绍下并发编程的三要素并发编程三要素原子性原子,即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。有序性程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)可见性当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获取...原创 2019-05-07 21:42:08 · 172 阅读 · 0 评论 -
JAVA并发1.并发基础与Java多线程
Java的多线程和并发性Java是最先支持多线程的开发的语言之一,Java从一开始就支持了多线程能力,因此Java开发者能常遇到上面描述的问题场景。这也是我想为Java并发技术而写这篇系列的原因。作为对自己的笔记,和对其他Java开发的追随者都可获益的。该系列主要关注Java多线程,但有些在多线程中出现的问题会和多任务以及分布式系统中出现的存在类似,因此该系列会将多任务和分布式系统方面作为参考...原创 2019-05-07 22:26:52 · 189 阅读 · 0 评论 -
JAVA并发19---J.U.C之线程池:ScheduledThreadPoolExecutor
原文出处:http://cmsblogs.com/ 『chenssy』ScheduledThreadPoolExecutor解析我们知道Timer与TimerTask虽然可以实现线程的周期和延迟调度,但是Timer与TimerTask存在一些缺陷,所以对于这种定期、周期执行任务的调度策略,我们一般都是推荐ScheduledThreadPoolExecutor来实现。下面就深入分析Sched...转载 2019-05-15 15:16:43 · 115 阅读 · 0 评论 -
JAVA并发20---sleep() 和 wait()
首先看一道常见的面试题(答案在文末):关于sleep()和wait(),以下描述错误的一项是:– A sleep是线程类(Thread)的方法,wait是Object类的方法;– B sleep不释放对象锁,wait放弃对象锁– C sleep暂停线程、但监控状态仍然保持,结束后会自动恢复– D wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态在...原创 2019-05-15 16:27:25 · 175 阅读 · 0 评论 -
JAVA并发8.J.U.C之读写锁:ReentrantReadWriteLock
原文出处:http://cmsblogs.com/ 『chenssy』重入锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少。然而读服务不存在数据竞争问题,如果一个线程在读时禁止其他线程读势必会导致性能降低。所以就提供了读写锁。读写锁维护着一对锁,一个读锁和一个写锁。通过分离读锁和写锁,使得并...转载 2019-05-10 22:08:48 · 106 阅读 · 0 评论 -
JAVA并发9.AQS共享模式与并发工具类的实现
CountDownLatchCountDownLatch 这个类是比较典型的 AQS 的共享模式的使用,这是一个高频使用的类。latch 的中文意思是门栓、栅栏,具体怎么解释我就不废话了,大家随意,看两个例子就知道在哪里用、怎么用了。CountDownLatch所描述的是”在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待“。在API中是这样描述的:用给定的计数 初始化 ...转载 2019-05-11 00:15:07 · 153 阅读 · 0 评论 -
JAVA并发10.J.U.C之Java并发容器:ConcurrentLinkedQueue
原文出自: http://cmsblogs.comConcurrentLinkedQueue是一个基于链接节点的无边界的线程安全队列,它采用FIFO原则对元素进行排序。采用“wait-free”算法(即CAS算法)来实现的。CoucurrentLinkedQueue规定了如下几个不变性:在入队的最后一个元素的next为null队列中所有未删除的节点的item都不能为null且都能从h...转载 2019-05-12 15:01:41 · 82 阅读 · 0 评论 -
JAVA并发11.J.U.C之Java并发容器:ConcurrentSkipListMap
什么是SkipList?在我没有参加某短视频平台的面试之前也一脸懵逼,正因为面试中被diss,才在整理之后写下这篇博客,希望能给读者一些帮助。SkipListSkip List ,称之为跳表,它是一种可以替代平衡树的数据结构,其数据元素默认按照key值升序,天然有序。Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,在...原创 2019-05-12 16:29:09 · 124 阅读 · 0 评论 -
JAVA并发.12---J.U.C之阻塞队列:ArrayBlockingQueue
原文出处:http://cmsblogs.com/ 『chenssy』ArrayBlockingQueue,一个由数组实现的有界阻塞队列。该队列采用FIFO的原则对元素进行排序添加的。ArrayBlockingQueue为有界且固定,其大小在构造时由构造函数来决定,确认之后就不能再改变了。ArrayBlockingQueue支持对等待的生产者线程和使用者线程进行排序的可选公平策略,但是在默...转载 2019-05-12 23:10:04 · 104 阅读 · 0 评论 -
JAVA并发18---深入分析ThreadLocal
原文出处:http://cmsblogs.com/ 『chenssy』ThreadLoacal是什么?ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线程同步无关。ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。那么ThreadLocal到底是什么呢?A...转载 2019-05-14 23:39:49 · 87 阅读 · 0 评论 -
JAVA并发17---J.U.C之阻塞队列:LinkedBlockingDeque
原文出处:http://cmsblogs.com/ 『chenssy』前面的BlockingQueue都是单向的FIFO队列,而LinkedBlockingDeque则是一个由链表组成的双向阻塞队列,双向队列就意味着可以从对头、对尾两端插入和移除元素,同样意味着LinkedBlockingDeque支持FIFO、FILO两种操作方式。LinkedBlockingDeque是可选容量的,在初...转载 2019-05-14 23:02:09 · 109 阅读 · 0 评论 -
JAVA并发16---J.U.C之阻塞队列:LinkedTransferQueue
原文出处http://cmsblogs.com/ 『chenssy』前面提到的各种BlockingQueue对读或者写都是锁上整个队列,在并发量大的时候,各种锁是比较耗资源和耗时间的,而前面的SynchronousQueue虽然不会锁住整个队列,但它是一个没有容量的“队列”,那么有没有这样一种队列,它即可以像其他的BlockingQueue一样有容量又可以像SynchronousQueue一...转载 2019-05-14 22:46:13 · 97 阅读 · 0 评论 -
JAVA并发2.深入理解Java内存模型JMM
JMM基础与happens-before并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里...转载 2019-05-08 13:01:13 · 105 阅读 · 0 评论 -
JAVA并发3.并发三大问题与volatile关键字,CAS操作
三大难题原子性:哪些指令必须是不可分割的。在Java内存模型中,这些规则需声明仅适用于-—实例变量和静态变量,也包括数组元素,但不包括方法中的局部变量-—的内存单元的简单读写操作。可见性:在哪些情况下,一个线程执行的结果对另一个线程是可见的。这里需要关心的结果有,写入的字段以及读取这个字段所看到的值。有序性:在什么情况下,某个线程的操作结果对其它线程来看是无序的。最主要的乱序执行问题主要表...转载 2019-05-08 19:08:11 · 204 阅读 · 0 评论 -
JAVA并发4.Java中的锁 Lock和synchronized
Java中的锁机制及Lock类锁的释放-获取建立的happens before 关系锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例代码:class MonitorExample { int a = 0; public synchronized void writer() { ...转载 2019-05-08 22:21:36 · 136 阅读 · 0 评论 -
JAVA并发14---J.U.C之阻塞队列:DelayQueue
原文出处:http://cmsblogs.com/ 『chenssy』DelayQueue是一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行。也就是说只有在延迟期到时才能够从队列中取元素。DelayQueue主要用于两个方面:缓存:清掉缓存中超时的缓存数据任务超时...转载 2019-05-13 23:10:36 · 104 阅读 · 0 评论 -
Java之线程池那些事儿
1.什么是线程池?实际开发中我们需要让程序执行某个特定任务时,就会开启一个线程,如果并发的线程数量太多,频繁地创建线程就会严重影响系统的运行效率,如何解决呢?有没有一种方式可以让线程得到复用?执行一次任务之后不被销毁,可以继续执行其他任务,这就跟数据库连接池的思路一样了,数据库连接池的实现逻辑是在缓冲池中预先放置一定数量的连接对象,然后进行复用,那么很显然,在缓冲池中预先放置一定数量的线程对象以...原创 2019-04-10 12:43:19 · 184 阅读 · 0 评论 -
JAVA并发15---J.U.C之阻塞队列:SynchronousQueue
原文出处:http://cmsblogs.com/ 『chenssy』作为BlockingQueue中的一员,SynchronousQueue与其他BlockingQueue有着不同特性:SynchronousQueue没有容量。与其他BlockingQueue不同,SynchronousQueue是一个不存储元素的BlockingQueue。每一个put操作必须要等待一个take操作,...转载 2019-05-13 23:48:52 · 89 阅读 · 0 评论 -
JAVA并发5.JMM中的final关键字解析
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面,我们通过一些示例性的代码来分别说明这两...转载 2019-05-09 12:34:32 · 138 阅读 · 0 评论 -
JAVA并发6.AQS详解
原文链接:mp.weixin.qq.comAQS简介java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可操作性,可中...转载 2019-05-09 18:55:32 · 165 阅读 · 0 评论 -
JAVA并发7.AQS中的公平锁与非公平锁,Condtion
公平锁和非公平锁ReentrantLock 默认采用非公平锁,除非你在构造方法中传入参数 true 。public ReentrantLock() { sync = new NonfairSync();}public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync();...转载 2019-05-09 23:48:13 · 224 阅读 · 0 评论 -
JAVA并发13-J.U.C之阻塞队列:PriorityBlockingQueue
原文出处:http://cmsblogs.com/ 『chenssy』我们知道线程Thread可以调用setPriority(int newPriority)来设置优先级的,线程优先级高的线程先执行,优先级低的后执行。而前面介绍的ArrayBlockingQueue、LinkedBlockingQueue都是采用FIFO原则来确定线程执行的先后顺序,那么有没有一个队列可以支持优先级呢? Pr...转载 2019-05-12 23:42:39 · 107 阅读 · 0 评论