JAVA并发编程
文章平均质量分 86
NullPointerExcept
这个作者很懒,什么都没留下…
展开
-
Java多线程系列--“JUC线程池”03之 线程池原理(二)
概要在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明。内容包括:线程池示例参考代码(基于JDK1.7.0_40)线程池源码分析 (一) 创建“线程池” (二) 添加任务到“线程池” (三) 关闭“线程池”转载请注明出处:http://www.c转载 2017-05-16 09:11:18 · 412 阅读 · 0 评论 -
Java多线程编程中不变模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式、Master-Worker模式、Guarded Suspeionsion模式、不变模式和生产者-消费者模式等。这篇文章主要讲述不变模式,关于其他多线程设计模式的地址如下:关于Future模式的详解: Java多线程编程中Future模式的详解关于Master-Worker模式的详解: Java多线程编程中Master-Wor转载 2017-05-17 11:07:42 · 847 阅读 · 0 评论 -
Java多线程编程中生产者-消费者模式的详解
生产者-消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责处理用户请求。生产者和消费者之间通过共享内存缓冲区进行通信。生产者-消费者模式中的内存缓冲区的主要功能是数据在多线程间的共享。此外,通过该缓冲区,可以缓解生产者和消费者之间的性能差。转载 2017-05-17 11:08:25 · 470 阅读 · 0 评论 -
Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式、Master-Worker模式、Guarded Suspeionsion模式、不变模式和生产者-消费者模式等。这篇文章主要讲述Future模式,关于其他多线程设计模式的地址如下:关于其他多线程设计模式的地址如下:关于Master-Worker模式的详解: Java多线程编程中Master-Worker模式的详解关于Gua转载 2017-05-17 11:26:44 · 1221 阅读 · 0 评论 -
Java多线程编程中Master-Worker模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式、Master-Worker模式、Guarded Suspeionsion模式、不变模式和生产者-消费者模式等。这篇文章主要讲述Master-Worker模式,关于其他多线程设计模式的地址如下:关于其他多线程设计模式的地址如下:关于Future模式的详解: Java多线程编程中Future模式的详解关于Guarded Su转载 2017-05-17 11:27:33 · 387 阅读 · 0 评论 -
编程世界的那把锁
1共享变量惹得祸我们这里是个典型的弱肉强食的世界,人口多而资源少,为了争抢有限的资源,大家都在自己能运行的CPU时间片里拼了老命,经常为了一个变量的修改而打的头破血流。100纳秒以前,我有幸占据了CPU,从内存中读取了一个变量x == 100, 我把它加了1, 休息了一会儿后我打算把它写回内存, 但是惊奇的发现: 内存中的x 已经变成102了。估计是转载 2017-05-10 09:14:55 · 343 阅读 · 0 评论 -
高性能IO模型浅析
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(Blocking IO):即传统的IO模型。(2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。(3)IO多路复用(IO Multiplexi转载 2016-11-21 09:34:35 · 329 阅读 · 0 评论 -
Java I/O底层是如何工作的?
本博文主要讨论I/O在底层是如何工作的。本文服务的读者,迫切希望了解Java I/O操作是在机器层面如何进行映射,以及应用运行时硬件都做了什么。假定你熟悉基本的I/O操作,比如通过Java I/O API读写文件。这些内容不在本文的讨论范围。目录缓存处理和内核vs用户空间虚拟内存内存分页面向文件、块的I/O文件锁定转载 2016-12-08 09:35:47 · 447 阅读 · 0 评论 -
用大白话聊聊分布式系统
一提起“分布式系统”,大家的第一感觉就是好高大上啊,深不可测,看各类大牛关于分布式系统的演讲或者书籍,也大多是一脸懵逼。本文期望用浅显易懂的大白话来就什么是分布式系统、分布式系统有哪些优势、分布式系统会面临哪里挑战、如何来设计分布式等方面的话题来展开讨论。什么是分布式系统 关于“分布式系统”的定义,我们先看下老外是怎么说的。《分布式系统原理和范型》一书中是这样定义分布式系统的:“分布转载 2017-07-05 10:56:55 · 484 阅读 · 0 评论 -
Java 多线程同步的五种方法
一、为什么要线程同步因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常。举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块。假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?取钱不成功,账户余额是100.取钱成功了,账户余额是0.那到底是哪个呢?很难说转载 2017-06-27 09:21:05 · 514 阅读 · 0 评论 -
Java多线程系列--“基础篇”11之 生产消费者问题
1. 生产/消费者模型生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”、“消费者”、“仓库”和“产品”。他们之间的关系如下:(01) 生产者仅仅在仓储未满时候生产,仓满则停止生产。(02) 消费者仅仅在仓储有产品时候才能消费,仓空则等待。(03) 当消费者发现仓储没产品可消费时候会通知生产者生产。(04) 生产者在生产出可消费产品时候,应该通知等待的消费转载 2017-05-08 10:59:46 · 389 阅读 · 0 评论 -
Java多线程系列--“基础篇”10之 线程优先级和守护线程
1. 线程优先级的介绍java 中的线程优先级的范围是1~10,默认的优先级是5。“高优先级线程”会优先于“低优先级线程”执行。java 中有两种线程:用户线程和守护线程。可以通过isDaemon()方法来区别它们:如果返回false,则说明该线程是“用户线程”;否则就是“守护线程”。用户线程一般用户执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务。需要注意的转载 2017-05-08 10:59:24 · 271 阅读 · 1 评论 -
Java多线程系列--“JUC线程池”04之 线程池原理(三)
本章介绍线程池的生命周期。在"Java多线程系列--“基础篇”01之 基本概念"中,我们介绍过,线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态。线程池也有5种状态;然而,线程池不同于线程,线程池的5种状态是:Running, SHUTDOWN, STOP, TIDYING, TERMINATED。线程池状态定义代码如下:private final Atom转载 2017-05-16 09:11:52 · 459 阅读 · 0 评论 -
Java多线程系列--“JUC线程池”05之 线程池原理(四)
概要本章介绍线程池的拒绝策略。内容包括:拒绝策略介绍拒绝策略对比和示例转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略介绍线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施。当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭。第二,任务数转载 2017-05-16 09:12:24 · 505 阅读 · 0 评论 -
Java多线程系列--“JUC线程池”06之 Callable和Future
概要本章介绍线程池中的Callable和Future。Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40)转载请注明出处:http://www.cnblogs.com/skywang12345/p/3544116.html Callable 和 Future 简介 Callable 和 Future 是比较有趣的一对转载 2017-05-16 09:13:08 · 294 阅读 · 0 评论 -
Java多线程系列--“基础篇”04之 synchronized关键字
1. synchronized原理在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,转载 2017-05-08 09:16:16 · 325 阅读 · 0 评论 -
Java多线程系列--“基础篇”05之 线程等待与唤醒
本章,会对线程等待/唤醒方法进行介绍。涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long timeout)和notify()4. wait() 和 notifyAll()5. 为什么notify(), wait()等函数定义在Object中,而不是Threa转载 2017-05-08 10:18:18 · 268 阅读 · 0 评论 -
Java多线程系列--“基础篇”06之 线程让步
概要本章,会对Thread中的线程让步方法yield()进行介绍。涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较1. yield()介绍yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield(转载 2017-05-08 10:56:49 · 353 阅读 · 0 评论 -
Java多线程系列--“基础篇”07之 线程休眠
1. sleep()介绍sleep() 定义在Thread.java中。sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。2. sleep()示例运行结果转载 2017-05-08 10:57:31 · 465 阅读 · 0 评论 -
Java多线程系列--“基础篇”08之 join()
1. join()介绍join() 定义在Thread.java中。join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。这句话可能有点晦涩,我们还是通过例子去理解:// 主线程public class Father extends Thread {public void run() {Son s = new Son();转载 2017-05-08 10:58:23 · 668 阅读 · 0 评论 -
Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
1. interrupt()说明在介绍终止线程的方式之前,有必要先对interrupt()进行了解。关于interrupt(),java的djk文档描述如下:http://docs.oracle.com/javase/7/docs/api/Interrupts this thread.Unless the current thread is interrupting转载 2017-05-08 10:59:02 · 557 阅读 · 0 评论 -
java线程并发基础
CPU、进程、线程我们知道进程是操作系统进行资源分配的最小单位,一个进程内部可以有多个线程进行资源的共享,线程作为CPU调度的最小单位,CPU会依据某种原则(比如时间片轮转)对线程进行上下文切换,从而并发执行多个线程任务。打个比喻,CPU就像高速公路一样,每条高速公路会有并排的车道,而线程就像在路上行驶的汽车一样。我们可以通过/proc/cpuinfo来查看服务转载 2017-08-16 09:31:47 · 198 阅读 · 0 评论 -
Java 多线程并发编程之 Synchronized 关键字
synchronized 关键字解析同步锁依赖于对象,每个对象都有一个同步锁。现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的同步锁,同时,线程 B 也去调用 Test 的 synchronized 方法,此时线程 B 无法获得 Test 的同步锁,必须等待线程 A 释放 Test 的同步锁才能获得从而执行对应方转载 2017-08-16 09:33:43 · 353 阅读 · 0 评论 -
JVM 并发性: 使用 Akka 执行异步操作
本 系列 中以前的文章介绍了如何通过以下方式实现并发性:并行地在多个数据集上执行相同的操作(就像 Java 8 流一样)显式地将计算构建成异步执行某些操作,然后将结果组合在一起(就像 future 一样)。这两种方法都是实现并发性的不错方式,但是您必须将它们明确地设计到应用程序中。在本文和接下来的几篇文章中,我将着重介绍一种不同的并发性实现方法,该方法基于一种特定的程序结构,与显式编码方法不同。这...转载 2018-05-28 18:24:24 · 3021 阅读 · 0 评论 -
理解线程池的原理
读完本文你将了解:什么是线程池线程池的处理流程保存待执行任务的阻塞队列创建自己的线程池JDK 提供的线程池及使用场景newFixedThreadPoolnewSingleThreadExecutornewCachedThreadPoolnewScheduledThreadPool两种提交任务的方法executesubmit关闭线程池如何合理地选择或者配置总结Thanks什么是线程池线程池的概念大家...转载 2018-05-29 10:49:48 · 159 阅读 · 0 评论 -
虚拟机内的锁优化(偏向锁,轻量级锁,自旋锁,重量级锁)
基础知识之一:锁的类型锁从宏观上分为:(1)乐观锁;(2)悲观锁。(1)乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取的方式是在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java中的乐观锁基本都...转载 2018-06-05 10:28:53 · 148 阅读 · 0 评论 -
java 多线程并发系列之 生产者消费者模式的两种实现
生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。真实世界中的生产者消费者模式生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费...转载 2018-05-30 09:27:43 · 332 阅读 · 0 评论 -
【多线程高并发】多线程的设计模式
关键字::多线程设计模式,Future模式,Master-Worker模式,生产者-消费者模型 github 地址: https://github.com/zhaikaishun/concurrent_programming 本篇文章代码在Multi_004 中多线程的设计模式代码在Multi_004当中 并行设计模式属于设计优化的一部分,他是对一些常用的多线程结构的总结和抽象,与串行程序相比,并...转载 2018-05-30 10:43:33 · 1649 阅读 · 0 评论 -
Java并发包基石-AQS详解
目录 1 基本实现原理 1.1 如何使用 1.2 设计思想 2 自定义同步器 2.1 同步器代码实现 2.2 同步器代码测试 3 源码分析 3.1 Node结点 3.2 独占式 3.3 共享式 4 总结 Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如Ree...转载 2018-05-30 18:21:03 · 889 阅读 · 0 评论 -
轻松学习java可重入锁(ReentrantLock)的实现原理
前言相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么实现的。如果真是这样,而且你有兴趣了解,今天我将带领你轻松的学习下java中非常重要,也非常基础的可重入锁-ReentrantLock的实现机制。听故事把知识掌握了在一个村子里面,有一口井水,水质非常的...转载 2018-05-31 11:35:55 · 162 阅读 · 0 评论 -
当ThreadLocal碰上线程池
ThreadLocal使用ThreadLocal可以让线程拥有本地变量,在web环境中,为了方便代码解耦,我们通常用它来保存上下文信息,然后用一个util类提供访问入口,从controller层到service层可以很方便的获取上下文。下面我们通过代码来研究一下ThreadLocal。新建一个ThreadContext类,用于保存线程上下文信息public class ThreadC...转载 2018-07-31 15:52:29 · 1221 阅读 · 0 评论 -
SimpleDateFormat时间格式化存在线程安全问题
想必大家对SimpleDateFormat并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题,因为 DateFormat 和 SimpleDateFormat 类不都是线程安全的,在多线程环境下调用 format() 和 parse() 方法应该使用同步代码来避免问题。下面我们通过...转载 2018-12-24 12:01:13 · 1378 阅读 · 0 评论 -
java-线程同步
线程世界出现了一把锁幸好还是又聪明人的,有人想到了一个解决问题的好方法。虽然不知道谁想到的注意,但是这个注意确实解决了一部分问题,解决的方案是加锁。你想要进行对一组加锁的代码进行操作吗?想的话就先去抢到锁,拿到锁之后就可以对被加锁的代码为所欲为了,倘若拿不到锁的话就只能在代码块门口等着,因为等的线程太多了,这还成为了一种社会现象(状态),该社会现象被命名为线程的阻塞。听上去很简单,但是实际上加锁有...转载 2018-05-24 09:23:53 · 154 阅读 · 0 评论 -
Coroutine in Java - Quasar Fiber实现
简介说到协程(Coroutine),很多人会想到go,lua,erlang等语言,其实JVM上也有蛮多的实现,如PicoThread,Kilim,Quasar等,本文主要介绍其中一种Coroutine实现 -- Quasar Fiber,Quasar Fiber相对来说流行度更好一些,如果之前没有接触过协程(用户级轻量级线程),可以看下What are fibers、Coroutine那么为什么要...转载 2018-05-25 15:45:20 · 3616 阅读 · 0 评论 -
Java 线程池的理论与实践
前段时间公司里有个项目需要进行重构,目标是提高吞吐量和可用性,在这个过程中对原有的线程模型和处理逻辑进行了修改,发现有很多基础的多线程的知识已经模糊不清,如底层线程的运行情况、现有的线程池的策略和逻辑、池中线程的健康状况的监控等,这次重新回顾了一下,其中涉及大量java.util.concurrent包中的类。本文将会包含以下内容:Java中的Thread与操作系统中的线程的关系线转载 2017-08-17 10:11:22 · 314 阅读 · 0 评论 -
Java 线程池(ThreadPoolExecutor)原理分析与使用
在我们的开发中“池”的概念并不罕见,有数据库连接池、线程池、对象池、常量池等等。下面我们主要针对线程池来一步一步揭开线程池的面纱。使用线程池的好处1、降低资源消耗这里提到了线程池的饱和策略,那我们就简单介绍下有哪些饱和策略:AbortPolicy为Java线程池默认的阻塞策略,不执行此任务,而且直接抛出一个运行时异常,切记ThreadPoolExec转载 2017-08-17 10:12:15 · 324 阅读 · 0 评论 -
Java 并发集合的实现原理
本文简要介绍Java并发编程方面常用的类和集合,并介绍下其实现原理。AtomicInteger可以用原子方式更新int值。类 AtomicBoolean、AtomicInteger、AtomicLong 和 AtomicReference 的实例各自提供对相应类型单个变量的访问和更新。基本的原理都是使用CAS操作:从Java1.5开始JDK的atomic包里提供了一转载 2017-08-18 09:56:39 · 358 阅读 · 0 评论 -
对高并发流量控制的一点思考
在实际项目中,曾经遭遇过线上5W+QPS的峰值,也在压测状态下经历过10W+QPS的大流量请求,主要就是自己对高并发流量控制的一点思考。应对大流量的一些思路首先,我们来说一下什么是大流量?那么接下来,我们重点说一下,限流。限流的常用方式限流的常用处理手段有:计数器、滑动窗口、漏桶、令牌。计数器计数器是一种比较简单的限流算法,用途比较广转载 2017-08-14 09:22:30 · 5947 阅读 · 0 评论 -
聊聊并发-Java中的Copy-On-Write容器
读的时候不需要加锁,如果读的时候有多个线程正在向ArrayList添加数据,读还是会读到旧的数据,因为写的时候不会锁住旧的ArrayList。JDK中并没有提供CopyOnWriteMap,我们可以参考CopyOnWriteArrayList来实现一个,基本代码如下:实现很简单,只要了解了CopyOnWrite机制,我们可以实现各种CopyOnWrite容器,并且在转载 2017-08-22 09:10:36 · 363 阅读 · 0 评论 -
进程和线程、协程的区别
现在多进程多线程已经是老生常谈了,协程也在最近几年流行起来。python中有协程库gevent,py web框架tornado中也用了gevent封装好的协程。本文主要介绍进程、线程和协程三者之间的区别。一、概念 1、进程进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程...转载 2018-05-25 11:28:45 · 1491 阅读 · 0 评论