Java多线程
文章平均质量分 93
Q蛋黄酱
这个作者很懒,什么都没留下…
展开
-
“J.U.C”:ReentrantLock之一简介
注:由于要介绍ReentrantLock的东西太多了,免得各位客官看累,所以分三篇博客来阐述。本篇博客介绍ReentrantLock基本内容,后两篇博客从源码级别分别阐述ReentrantLock的lock、unlock实现机制。ReentrantLock,可重入的互斥锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比sync转载 2017-04-08 11:51:26 · 282 阅读 · 0 评论 -
Java集合——HashMap多线程死循环问题
问题的症状从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题。后来,我们的程序性能有问题,所以需要变成多线程的,于是,变成多线程后到了线上,发现程序经常占了100%的CPU,查看堆栈,你会发现程序都Hang在了HashMap.get()这个方法上了,重启程序后问题消失。但是过段时间又会来。而且,这个问题在测试环境里可能很难重现。转载 2017-05-21 21:13:54 · 411 阅读 · 0 评论 -
《Java源码分析》:Future、RunnableFuture、FutureTask
《Java源码分析》:线程池 Future、RunnableFuture、FutureTask在使用ThreadPoolExecutor使用submit提交任务后然后交给线程池中的线程去执行,是吧在ThreadPoolExecutor(其实是在AbstractExecutorService中)有如下几个submit方法, public Future submit(Runn转载 2017-06-12 19:25:16 · 404 阅读 · 0 评论 -
理解ThreadLocal
ThreadLocal是什么早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它转载 2017-07-30 23:09:08 · 206 阅读 · 0 评论 -
J.U.C之并发工具类:CyclicBarrier
CyclicBarrier,一个同步辅助类,在API中是这么介绍的:它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。通俗点讲就是:让一组线程到达一个转载 2017-08-06 17:36:02 · 245 阅读 · 0 评论 -
Java 并发之 CountDownLatch、CyclicBarrier 和 Semaphore
(原来写过一篇相同标题的文章,不过因为 OSChina 编辑器的缘故,格式改乱了,所以重写一篇。原文已删除,收藏原文的朋友对不住。)这次说一下 JUC 中的同步器三个主要的成员:CountDownLatch、CyclicBarrier 和 Semaphore(不知道有没有初学者觉得这三个的名字不太好记)。这三个是 JUC 中较为常用的同步器,通过它们可以方便地实现很多线程之间协作的功能。(下面转载 2017-08-21 15:38:09 · 182 阅读 · 0 评论 -
Java并发之AQS详解
一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是转载 2017-09-07 14:42:59 · 291 阅读 · 0 评论 -
“J.U.C”:原子类的实现(CAS算法)
阅读目录AtomicInteger的实现CAS算法 Java提供的原子类是靠 sun 基于 CAS 实现的,CAS 是一种乐观锁。关于乐观锁与悲观锁。 原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读-改-写操作。AtomicInteger 表示一个int类型的值,并提供了 get 和 set 方法,这些 Volatile 类型的int转载 2017-09-09 12:54:51 · 249 阅读 · 0 评论 -
Spring集成Quartz---具体场景应用
Java并发编程阶段,突然接触到了定时调度任务这一概念,恰巧在实习期间有过运用,因此特写此博客以记录,欢迎指正和讨论。 ——前言本文将分以下四点进行讨论。篇幅过长的话,可能分其他章节。Quartz基本概念一、quartz核心概念 先来看一张图: 对于上图中各个部分的概念解释如下: scheduler:任务调度器 trig原创 2017-09-27 18:28:07 · 1026 阅读 · 0 评论 -
Spring集成Quartz---Executor框架
ThreadPool衍生开来将还有一个特定的Executor框架。下文将详细展开讲。1.Executor框架简介1.1 概述在程序运行过程中,创建和销毁线程需要一定的开销,因此如果我们为每一个任务创建一个新线程来执行,这些线程的创建及销毁将消耗大量的计算机资源。尤其是在线程任务不是特别重的情况下,系统的资源有可能极大的耗费在线程的创建与销毁上。因此,我们需要一种容器去集中的原创 2017-09-28 08:49:25 · 463 阅读 · 0 评论 -
Spring集成Quartz--ScheduleThreadPool详解
简介关于ScheduledThreadPoolExecutor大致特性,JDK1.8中是这么介绍的。 A ThreadPoolExecutor that can additionally schedule commands to run after a given delay, or to execute periodically. This class is原创 2017-10-11 11:12:06 · 2145 阅读 · 0 评论 -
java多线程之CAS
前言 在Java并发包中有这样一个包,java.util.concurrent.atomic,该包是对Java部分数据类型的原子封装,在原有数据类型的基础上,提供了原子性的操作方法,保证了线程安全。下面以AtomicInteger为例,来看一下是如何实现的。public final int incrementAndGet() { for (;;) { int current转载 2017-05-27 16:23:06 · 258 阅读 · 0 评论 -
“J.U.C”:Condition
在看Condition之前,我们先来看下面这个例子:工厂类,用来存放、取出商品:[java] view plain copypublic class Depot { private int depotSize; //仓库大小 private Lock lock; //独占锁转载 2017-05-08 17:06:51 · 227 阅读 · 0 评论 -
“J.U.C”:ReentrantLock之三unlock方法分析
前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获取锁。但是对于unlock()而已,它是不分为公平锁和非公平锁的。[java] view plain copypublic void unlock()转载 2017-04-12 09:34:32 · 288 阅读 · 0 评论 -
JAVA多线程之volatile 与 synchronized 的比较
一,volatile关键字的可见性要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下:从图中可以看出:①每个线程都有一个自己的本地内存空间--线程栈空间???线程执行时,先把变量从主内存读取到线程自己的本地内存空间,然后再对该变量进行操作②对该变量操作完后,在某个时间再把变量刷新回主内存关于JAVA内存模型转载 2017-04-02 16:42:55 · 239 阅读 · 0 评论 -
Java集合---ConcurrentHashMap原理分析
Java集合---ConcurrentHashMap原理分析 集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的Concurr转载 2017-04-17 17:45:13 · 237 阅读 · 0 评论 -
Java并发编程:并发容器之CopyOnWriteArrayList(转载)
Java并发编程:并发容器之CopyOnWriteArrayList(转载)Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个转载 2017-04-17 20:40:42 · 288 阅读 · 0 评论 -
Java多线程——关键字synchronized
在我们的实际应用当中可能经常会遇到这样一个场景:多个线程读或者、写相同的数据,访问相同的文件等等。对于这种情况如果我们不加以控制,是非常容易导致错误的。在java中,为了解决这个问题,引入临界区概念。所谓临界区是指一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问。在java中为了实现临界区提供了同步机制。当一个线程试图访问一个临界区时,他将使用一种同步机制来查看是不是已经转载 2017-04-05 20:40:49 · 363 阅读 · 0 评论 -
线程基本概念
线程和进程的区别是什么下面细说背景:CPU+RAM+各种资源(比如显卡,光驱,键盘,GPS, 等等外设)构成我们的电脑,但是电脑的运行,实际就是CPU和相关寄存器以及RAM之间的事情。一个最最基础的事实:CPU太快,太快,太快了,寄存器仅仅能够追的上他的脚步,RAM和别的挂在各总线上的设备完全是望其项背。那当多个任务要执行的时候怎么办呢?轮流着来?或者谁优先级高谁来?不管怎么样的策略,一句话就是在...转载 2017-04-06 17:19:43 · 289 阅读 · 0 评论 -
Java并发编程:线程池的使用
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池转载 2017-05-23 10:00:25 · 354 阅读 · 0 评论 -
Java多线程:线程状态
一. 线程状态类型1. 新建状态(New):新创建了一个线程对象。2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂转载 2017-05-06 22:50:57 · 210 阅读 · 0 评论 -
JAVA多线程之线程间的通信方式
JAVA多线程之线程间的通信方式一,介绍本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码。 二,线程间的通信方式①同步这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信。参考示例:public class MyObject {转载 2017-05-08 16:49:08 · 211 阅读 · 0 评论 -
“J.U.C”:ReentrantLock之二lock方法分析
前一篇博客简单介绍了ReentrantLock的定义和与synchronized的区别,下面跟随LZ的笔记来扒扒ReentrantLock的lock方法。我们知道ReentrantLock有公平锁、非公平锁之分,所以lock()我也已公平锁、非公平锁来进行阐述。首先我们来看ReentrantLock的结构【图来自Java多线程系列–“JUC锁”03之 公平锁(一)】:从上图转载 2017-05-08 16:55:01 · 218 阅读 · 0 评论 -
Java多线程学习
此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的线程函数用法、概述等。首先让我们来了解下在操作系统中进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--...转载 2018-04-22 17:00:06 · 140 阅读 · 0 评论