并发编程
文章平均质量分 79
琦彦
Find out who you are,and be that person.
展开
-
美团面试题:JVM堆内存溢出后,其他线程是否可继续工作?
最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。由于题目中给出的OOM,java中OOM又分很多类型;比如:堆溢出(“java.lang.OutOfMemoryError: Java heap space”)、永久带溢出(“java.lang.OutOfMemoryError:Permgen space”)、不能创建线程(“java.lang.转载 2021-04-06 13:55:57 · 366 阅读 · 0 评论 -
Java线程池实现原理及其在美团业务中的实践
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程池遇到的问题,并给出了一种动态化线程池解决方案。一、写在前面1.1 线程池是什么线程池(Thread转载 2021-01-08 16:50:10 · 356 阅读 · 0 评论 -
ThreadPoolExecutor:线程池不允许使用Executors创建
合理利用线程池能够带来三个好处第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌线程池的主要工...原创 2018-08-11 11:18:54 · 18817 阅读 · 7 评论 -
ThreadLocal、Volatile、synchronized、Atomic关键字扫盲
前言对于ThreadLocal、Volatile、synchronized、Atomic这四个关键字,我想一提及到大家肯定都想到的是解决在多线程并发环境下资源的共享问题,但是要细说每一个的特点、区别、应用场景、内部实现等,却可能模糊不清,说不出个所以然来,所以,本文就对这几个关键字做一些作用、特点、实现上的讲解。1、Atomic具体参考:https://blog.csdn.net/f...转载 2018-10-11 13:46:03 · 5728 阅读 · 0 评论 -
Java中的锁分类和区别
在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁/非公平锁公...转载 2018-10-12 10:15:39 · 6036 阅读 · 0 评论 -
Java 里如何实现线程间通信
正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。本文涉及到的知识点:thread.join(), object.wait(), object.notify(), CountdownLatch, CyclicBarrier, FutureTask, Callable本文涉及代码:...转载 2018-10-15 11:08:07 · 13534 阅读 · 0 评论 -
Java8 和 Java 9中并发工具的改变
Java 8 和 Java 9中 concurrent包有了一些改变, 本文对这些改变做了汇总。Java 8 中 Concurrent package的改变java.util.concurrent中新的类和接口增加了两个新接口和4个新类:接口CompletableFuture.AsynchronousCompletionTask 接口CompletionStage ...转载 2019-02-19 09:54:27 · 557 阅读 · 0 评论 -
详解:淘宝大秒杀系统是如何设计的?
一些数据大家还记得2013年的小米秒杀吗?三款小米手机各11万台开卖,走的都是大秒系统,3分钟后成为双十一第一家也是最快破亿的旗舰店。经过日志统计,前端系统双11峰值有效请求约60w以上的QPS ,而后端cache的集群峰值近2000w/s、单机也近30w/s,但到真正的写时流量要小很多了,当时最高下单减库存tps是红米创造,达到1500/s。热点隔离秒杀系统设计的第一个原则就是将这种...转载 2019-07-02 18:52:12 · 1826 阅读 · 0 评论 -
Java 容器篇
一、概览CollectionMap二、容器中的设计模式迭代器模式适配器模式三、源码分析ArrayListVectorCopyOnWriteArrayListLinkedListHashMapConcurrentHashMapLinkedHashMapWeakHashMap参考资料一、概览容器主要包括 Collection 和 Map 两种...转载 2019-07-01 09:12:07 · 436 阅读 · 0 评论 -
ScheduledExecutorService:多线程任务调度
今天使用Timer实现任务调度时,阿里巴巴Java开发规范提示多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。 建议多线程-任务调度,使用如下方式: 首先引入commons.lang3的jar包 <!-- https://mvnrepos...原创 2018-08-09 19:45:44 · 10311 阅读 · 0 评论 -
Atomic实现多线程下,无锁的进行原子操作
AtomicInteger这个类的存在是为了满足在高并发的情况下,原生的整形数值自增线程不安全的问题。原创 2018-06-20 16:53:53 · 7254 阅读 · 0 评论 -
Junit单元测试不支持多线程测试--原因分析和问题解决
问题现象import org.junit.Test;/** * @Title: junit多线程测试 * @ClassName: JunitMultiThreadTest.java * @Description: * * @Copyright 2016-2018 - Powered By 研发中心 * @author: * @date: 2018-01-30 19:31 * @ver原创 2018-01-30 20:02:27 · 21406 阅读 · 2 评论 -
ThreadLocal应用和那些“坑”
ThreadLocal概述和API 三、典型应用 3.1:下面的类为每个线程生成不同的ID,当某个线程第一次调用Thread.get()时,会为该线程赋予一个ID,并且在后续的调用中不再改变。import java.util.concurrent.atomic.AtomicInteger; public class ThreadId { // Atomic int...转载 2017-12-22 08:15:52 · 19624 阅读 · 4 评论 -
ThreadLocal概述和API
一、概述ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制转载 2017-12-21 10:38:13 · 13759 阅读 · 0 评论 -
Java多线程总结
前言Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问题像在Java并发编程的过程中遇到了什么挑战,Java内存模型,JDK1.5引入了哪些更高阶的并发工具,并发编...转载 2018-02-07 19:33:19 · 14001 阅读 · 0 评论 -
Java单例模式的不同写法(懒汉式、饿汉式、双检锁、静态内部类、枚举)
Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。一些管理器和控制器常被设计成单例模式。单例模式好处:它能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间; 能够避免由于操作多个实例导致的逻辑错误。 如果一个对象有可能贯穿整个应用程序,而且起到了全局统一管理控制的作用...原创 2018-02-08 10:19:47 · 33267 阅读 · 5 评论 -
Synchronized与Lock的区别与应用场景
同步代码块,同步方法,或者是用java提供的锁机制,我们可以实现对共享资源变量的同步控制。技术点:1、线程与进程:在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程。关系是线程–>进程–>程序的大致组成结构。所以线程是程序执行流的最小单位,而进程是系统进行资源分配和调度的一个独立单位。以下我们所有讨论的都是建立在线程基础之上。2、Thread的几...原创 2018-04-01 09:26:42 · 35848 阅读 · 7 评论 -
从Java Future 到 Guava ListenableFuture实现异步非阻塞调用
前言 随着移动互联网的蓬勃发展,手机App层出不穷,其业务也随之变得错综复杂。针对于开发人员来说,可能之前的一个业务只需要调取一次第三方接口以获取数据,而如今随着需求的增加,该业务需调取多个不同的第三方接口。通常,我们处理方法是让代码同步顺序的去调取这些接口。显然,调取接口数量的增加必然会造成响应时间的增加,势必会对系统性能造成一定影响。 为了保证系统响应迅速,需要寻找一...转载 2018-07-04 08:04:01 · 7881 阅读 · 0 评论 -
JAVA多线程实现的四种方式
Java多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。 其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。 1、继承Thread类创建线程 Thread类本...转载 2018-06-19 18:44:40 · 5467 阅读 · 0 评论 -
Java并发编程之CAS
CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术。简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。这听起来可能有一点复杂但是实际上你理解之后发现很简单,接下来,让我们跟深入的了解一下这项技术。CAS的使用场景在程序和算法中一个经常出现的模转载 2018-02-01 08:56:56 · 13153 阅读 · 0 评论