多线程
吴敏强
大学毕业有5年从事金融行业软件开发,之后一直在国内最大移动互联网医疗公司工作
展开
-
Java 并发基础之内存模型
关于 Java 并发也算是写了好几篇文章了,本文将介绍一些比较基础的内容,注意,阅读本文需要一定的并发基础。本文的主要目的是让大家对于并发程序中的重排序、内存可见性以及原子性有一定的了解,同时要能准确理解 synchronized、volatile、final 几个关键字的作用。另外,本文还对双重检查形式的单例模式为什么需要使用 volatile 做了深入的解释。并发三问题1. 重排序2. 内存可...转载 2018-03-29 19:25:48 · 265 阅读 · 0 评论 -
理解线程池的原理
1.关于线程池线程池的技术背景在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些”池化资源”技术产生的原因...转载 2018-03-29 16:28:54 · 228 阅读 · 0 评论 -
Java并发编程:阻塞队列
在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空...转载 2018-04-19 10:03:04 · 101 阅读 · 0 评论 -
不惑JAVA之JAVA基础 - 锁 -synchronized、Lock解析
锁主要解决线程安全问题。而线程安全问题,即多个线程同时访问一个资源时,会导致程序运行结果并不是想看到的结果。synchronized先来了解一下互斥锁,顾名思义:能到达到互斥访问目的的锁。如果对临界资源加上互斥锁,当一个线程在访问该临界资源时,其他线程便只能等待。 在Java中,每一个对象都拥有一个锁标记(monitor),也称为监视器,多线程同时访问某个对象时,线程只有获取了该对象的锁才能访问...转载 2018-04-25 20:16:48 · 145 阅读 · 0 评论 -
深入理解Callable
深入理解Callablehttps://blog.csdn.net/qq_19431333/article/details/77483763转载 2018-11-07 15:41:28 · 122 阅读 · 0 评论 -
彻底理解Java的Future模式
先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材。网上购买厨具比较方便,食材去超市买更放心。实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材。所以,在主线程里面另起一个子线程去网购厨具。但是,子线程执行的结果是要返回厨具的,而run方法是没有返回值的。所以,这才是难点,需要好好考虑一下。模拟代码1:package test;public clas...转载 2018-11-07 15:47:13 · 139 阅读 · 0 评论 -
wait、notify和notifyAll转换
java中对象锁的模型,JVM会为一个使用内部锁(synchronized)的对象维护两个集合,Entry Set和Wait Set对于Entry Set:如果线程A已经持有了对象锁,此时如果有其他线程也想获得该对象锁的话,它只能进入Entry Set,并且处于线程的BLOCKED状态。对于Wait Set:如果线程A调用了wait()方法,那么线程A会释放该对象的锁,进入到Wait Se...转载 2018-11-21 20:23:02 · 141 阅读 · 0 评论 -
NIO编程之ServerSocketChannel用法详解
之前一直看不懂NIO中的ServerSocketChannel和SocketChannel的区别,看了这篇博文,感觉通俗易懂,于是决定分享一下。。。。在用nio通讯的过程我用以下情景给你模拟: 1. 学校(ServerSocketChannel) 2。 学校教务处(Selector) 3。 老师 (ServerSocket ) 4。 学生 (SocketChannel) 5。 员工...转载 2018-11-23 16:30:00 · 2579 阅读 · 0 评论 -
转NIO讲的非常清楚的文章
https://blog.csdn.net/kavu1/article/details/53125667转载 2018-11-23 16:52:13 · 199 阅读 · 0 评论 -
JUC方面脑图
转载 2019-01-16 17:28:07 · 1345 阅读 · 2 评论 -
java多线程脑图-需要熟悉的知识
原文地址:https://blog.csdn.net/cj2580/article/details/53035501转载 2018-03-29 14:52:26 · 344 阅读 · 0 评论 -
java并发基础(六)--- 活跃性、性能与可伸缩性
《java并发编程实战》的第9章主要介绍GUI编程,在实际开发中实在很少见到,所以这一章的笔记暂时先放一放,从第10章开始到第12章是第三部分,也就是活跃性、性能、与测试,这部分的知识偏理论多一些,但是尽量能用代码讲明白的问题就不用文字,话不多说,进入正题。一、死锁 在学习java基础的时候就听老师讲过“哲学家就餐”的例子,时间久了具体是怎么回事也容易忘,这里重新整理下。5个哲学家去吃中餐,坐在...转载 2018-03-29 11:13:42 · 127 阅读 · 0 评论 -
java并发基础(五)--- 线程池的使用
第8章介绍的是线程池的使用,直接进入正题。一、线程饥饿死锁和饱和策略 1.线程饥饿死锁 在线程池中,如果任务依赖其他任务,那么可能产生死锁。举个极端的例子,在单线程的Executor中,如果一个任务提交了另一个任务到相同的Executor中,并等待其返回,那么就会发生死锁。第二个任务停留在工作队列中,第一个又一直等待(因为是单线程)。这块记住一个信息,就是如果线程池中的任务是互相依赖的,除非线...转载 2018-03-29 11:12:54 · 122 阅读 · 0 评论 -
java 内存模型的理解
之前一直在实习,博客停写了一段时间,现在秋招开始了,所以辞职回来专心看书,同时将每天的收获以博客的形式记录下来。最近在看jvm相关的书籍,下面对面试中问得最多的部分--java 内存模型进行简单总结。本篇博客大概由一下几个部分组成:1、程序在真实物理世界的内存模型2、java的内存模型3、java中的volatile与线程安全4、happen-before原则与加锁。 一、程序在物理世界中是怎样运...转载 2018-04-03 10:35:30 · 147 阅读 · 0 评论 -
Java子线程中的异常处理
在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了。那么,在并发情况下,比如在父线程中启动了子线程,如何正确捕获子线程中的异常,从而进行相应的处理呢?也许有人会觉得,很简单嘛,直接在父线程启动子线程的地方try ... catch一把就可以了,其实这是不对的。让我们回忆一下Runnable接口的run方法的完整签名,因为没有标识thro...转载 2018-04-08 17:02:17 · 302 阅读 · 0 评论 -
Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失(一)
在Spring Cloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离。在使用线程隔离的时候,有个问题是必须要解决的,那就是在某些业务场景下通过ThreadLocal来在线程里传递数据,用信号量是没问题的,从请求进来,但后续的流程都是通一个线程。当隔离模式为线程时,Hystrix会将请求放入Hystrix的线...转载 2018-04-08 18:13:52 · 983 阅读 · 0 评论 -
Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失(二)
前言上篇文章《Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失》我们对ThreadLocal数据丢失进行了详细的分析,并通过代码的方式复现了这个问题。在上篇文章的末尾我也说了思路给大家提供了,如果需要能够在Hystrix 为线程隔离模式也能正确传递数据的话,需要我们自己去修改。我这边以Zuul中自定义负载均衡策略来进行讲解,在Zuul中需要实现灰度发布的功能,需...转载 2018-04-08 18:14:59 · 610 阅读 · 0 评论 -
深入理解 Java 多线程核心知识:跳槽面试必备
多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。本文从基础概念开始到最后的并发模型由浅入深,讲解下线程方面的知识。概念梳理本节我将带大家了解多线程中几大基础概念。并发与并行并行,表示两个线程同时做事情。并发,表示一会做这个事情,一会做另一个事...转载 2018-04-03 10:32:16 · 120 阅读 · 0 评论 -
java并发基础(一)
最近在看《java并发编程实战》,希望自己有毅力把它读完。 线程本身有很多优势,比如可以发挥多处理器的强大能力、建模更加简单、简化异步事件的处理、使用户界面的相应更加灵敏,但是更多的需要程序猿面对的是安全性问题。看下面例子:public class UnsafeSequence { private int value; /*返回一个唯一的数值*/ public ...转载 2018-03-29 10:30:42 · 151 阅读 · 0 评论 -
java并发基础(二)
《java并发编程实战》终于读完4-7章了,感触很深,但是有些东西还没有吃透,先把已经理解的整理一下。java并发基础(一)是对前3章的总结。这里总结一下第4、5章的东西。一、java监视器模式 概念:把对象的所有可变状态都封装起来,并由对象自己的内置锁来保护。比如最简单的形式:public final class Counter{ private long value = 0 ; ...转载 2018-03-29 10:32:07 · 141 阅读 · 0 评论 -
java并发基础(三)--- 任务执行
第6章开始是第二部分,讲解结构化并发应用程序,大多数并发应用程序都是围绕“任务执行”构造的,任务通常是一些抽象的且离散的工作单元。一、线程池大多数服务器应用程序都提供了一种自然的任务边界:以独立的客户请求为边界。现在我们要实现自己的web服务器,你一定见过这样的代码:class SingleThreadWebServer { public static void main(String[]...转载 2018-03-29 11:11:09 · 190 阅读 · 0 评论 -
java并发基础(四)--- 取消与中断
《java并发编程实战》的第7章是任务的取消与关闭。我觉得这一章和第6章任务执行同样重要,一个在行为良好的软件和勉强运行的软件之间的最主要的区别就是,行为良好的软件能很完善的处理失败、关闭和取消等过程。一、任务取消 在java中没有一种安全的抢占式(收到中断请求就立刻停止)的方式来停止线程,因此也没有安全的抢占式方法来停止任务。只有一些协作式的机制,比如设置请求已取消的标识。在下面的例子中,Pr...转载 2018-03-29 11:12:07 · 121 阅读 · 0 评论 -
轻松学习java可重入锁(ReentrantLock)的实现原理
前言相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么实现的。如果真是这样,而且你有兴趣了解,今天我将带领你轻松的学习下java中非常重要,也非常基础的可重入锁-ReentrantLock的实现机制。听故事把知识掌握了在一个村子里面,有一口井水,水...转载 2019-01-16 17:38:31 · 144 阅读 · 0 评论