![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发与多线程
文章平均质量分 88
Mirana_77
这个作者很懒,什么都没留下…
展开
-
synchronized关键字
synchronized关键字锁相关知识 多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;这种资源可能是:对象、变量、文件等。共享:资源可以由多个线程同时访问可变:资源可以在其生命周期内被修改引出的问题 由于线程执行的过程是不可控的,所以需要采用同步机制来协同对对象可变状态的访问!互斥的两种方案 最容易想到的在多线程编程下,对资源的保护那就是采用互斥的手段。 在操作系统种,对于进程互斥有两种实现方案:信号量与管程。事实上,它们原创 2021-12-25 16:06:27 · 442 阅读 · 0 评论 -
优雅的退出
优雅的退出程序如何退出 我们希望任何程序的优雅退出,都需要在退出前做好收尾工作,比如我们在关机时,一般都是会按部就班的关机,如果长时间没响应了才会直接去按关机键强制关机。所以我们希望在退出任何程序前,都要先做好相应的收尾工作,那么退出程序一般会分为这几步:切断上游流量入口,确保不再有流量进入到当前节点向应用发送kill 命令,在设定的时间内待应用正常关闭若超时后应用仍然存活,则使用kill -9命令强制关闭不同层面の优雅关闭操作系统层面,提供了 kill -9 (SIGKILL)和 k原创 2021-12-17 16:05:15 · 3216 阅读 · 0 评论 -
线程池の优雅使用
线程池の优雅使用为什么需要线程池复用线程 在之前学习线程池的时候,其实也提到过,创建线程并不是我们认为的new个Thread对象就完事儿,实际上创建线程还涉及到内存的分配,创建以及销毁内存都是相对重量级的操作(相对进程而言);其次,系统分给每个进程的内存也是有限制的,可以想象,每个进程的内存-堆的内存-方法区的内存-程序计数器的内存-进程本身的内存,剩下的就是虚拟机栈和本地方法栈,加上如果每个线程分配到的栈容量越大,那可以创建的线程也就越少,如果无脑创建线程会导致内存溢出——“OOM”。那复用就是一原创 2021-12-17 14:11:25 · 747 阅读 · 0 评论 -
并发编程——并发容器
并发编程——并发容器 本文总结下Java中的并发容器。 Java中的容器主要分为四个大类:List、Map、Set、Queue。我们常用的ArrayList、HashMap并不是并发安全的,在JDK1.5之前,其实JDK有提供线程安全的容器——Collections类中的synchronized系列,synchronizedList、SynchronizedMap、SynchronizedSet,它们被称为同步容器。 它们的实现也非常的简单粗暴: 下面截取部分synchronizedList原创 2021-11-27 17:10:46 · 1124 阅读 · 0 评论 -
并发编程——线程协作
并发编程——线程协作 前面学习了线程,那么并发编程中,如何协调多个线程来开发呢?Semaphore 信号量跟前面将的同步互斥解决方案——信号量是一个东西,这是JDK的信号量实现。源码分析 先看下JDK的Semaphore类注释,看下Semaphore是做什么的:A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each acquire blocks if necessary until原创 2021-11-22 17:07:26 · 503 阅读 · 0 评论 -
并发基础知识
并发简述 Java在设计之初,就是支持多线程的语言。 在Java学习中,我们经常能听到:高并发、多线程这样的词汇。那么,高并发是什么?线程是什么?高并发与线程有什么关系呢?线程与进程 在oracle的官方文档中,对进程与线程是这样描述的:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0HfiQPX9-1636536872218)(image-20211110142756751.png)] 翻译过来,就是进程,是通过fork命令创建出来的运行环境,包含了如原创 2021-11-10 17:35:10 · 614 阅读 · 0 评论 -
并发与多线程学习思路
仅个人在并发与多线程上的学习思路,有问题请指正 首先总结了多线程与并发的关系,在其中对线程与进程的关系、并发并行串行三者的概念做了总结,然后重点看了Java中的线程,对它的属性、Thread类源码,生命周期、创建启动、停止中断、异常情况处理等问题做了总结,然后了解了线程池,进而在并发问题上,从为什么会有并发问题,引发到了JMM,Java内存模型,然后对并发问题的安全性处理方案做了总结,在互斥方面介绍了操作系统的两种同步互斥方案—管称与信号量。 接下来会对Java中的锁进一步分类: 锁介绍原创 2021-11-20 14:23:11 · 149 阅读 · 0 评论 -
线程篇——线程的创建与启动
线程的创建与启动创建线程 关于创建线程,我们阅读Thread类源码的注释:There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread. This subclass should override the run method of class Thread. An instance of the subclass can then be all原创 2021-11-11 17:41:40 · 591 阅读 · 0 评论 -
线程篇——线程的停止与中断
interrupt还是先看下Thread类中interrupt方法的注释:Interrupts this thread.Unless the current thread is interrupting itself, which is always permitted, the checkAccess method of this thread is invoked, which may cause a SecurityException to be thrown.If this thread i原创 2021-11-14 12:31:07 · 1882 阅读 · 0 评论 -
线程篇——线程池
线程池为什么需要线程池 经过前面对线程的学习,我们会发现创建线程看起来很简单,new Thread()就完事儿了,但是实际上创建线程需要调用操作系统内核的API,然后操作系统需要为它分配一系列的资源。可以说创建线程是一件成本非常高的事情,线程是一个重量级对象,要避免频繁的创建与销毁。 那我们就需要有个地方,可以保存创建好的线程,需要的时候去里面拿就行了,用完了放回去,以便下次可以继续使用。我们希望的线程池 我们认为的线程池往往是这样的: 需要的时候我们去线程池获取线程,然后执行我们的业原创 2021-11-17 17:21:04 · 526 阅读 · 2 评论 -
并发编程应用——线程池中的ThreadLocal变量传递
线程池中的ThreadLocal变量传递 本文讲述下在项目开发过程中遇到的实际问题。问题问题描述 之前搞得项目是SpringCloud开发的微服务项目,用户登录之后把用户信息塞到header里给我们,然后后端统一在网关拦截,读取用户ID然后塞到用户上下文中。但是我们在改造项目的时候发现个问题,莫名其妙的用户信息丢失了 经过排查,发现是因为SpringCloud的Hystrix隔离策略默认是线程池隔离。原因分析 在前面其实有讲过,信号量跟管程都是操作系统的同步互斥方案,那这里Hytrix原创 2021-11-21 17:54:16 · 1675 阅读 · 0 评论 -
线程篇——线程的异常处理
Java异常处理体系(下图截取自慕课网视频)Error跟Exception都是继承ThrowableError指的是Java运行过程中系统的内部错误或者资源耗尽,一旦发生,并不能通过代码层面来catch住Exception分为两种:RuntimeException跟其他异常 RuntimeException是程序的问题,Error跟RuntimeException都是编译器无法预测的,都称非受检查异常 其余称为受检查异常,需要我们在程序中对这些可能出现的异常进行处理多线程中的异常处理原创 2021-11-14 18:47:53 · 1974 阅读 · 0 评论 -
线程篇——Thread类源码
Thread类源码Thread类重要属性 我们跟到Thread类,看下线程有哪些属性。 Thread类的重要属性: /* For autonumbering anonymous threads. */ private static int threadInitNumber; /* Whether or not the thread is a daemon thread. */ private boolean daemon = false; privat原创 2021-11-14 12:43:07 · 1300 阅读 · 0 评论 -
Java内存模型
多线程编程的问题 在前面阅读了Thread类的源码,总结了线程的创建、停止、生命周期,以及多线程编程的异常处理,那么接下来就要总结多线程编程下的安全问题。 事实上,并不是所用的情况用多线程就一定比单线程快。多线程如果使用不当,不仅会带来严重的安全性问题,也会造成性能问题。 在JVM内存结构中,我们知道栈、程序计数器、局部变量这些是线程私有的,但是进程范围内的资源,同一个进程内的线程都会共享进程内的地址空间,那么它们会共享堆上分配的对象。当多个线程并发运行时,它们就可能会访问或者修改其他线程正在使原创 2021-11-16 18:23:22 · 2963 阅读 · 0 评论 -
并发编程的问题
并发编程的问题安全性问题 事实上,并不是所用的情况用多线程就一定比单线程快。多线程如果使用不当,不仅会带来严重的安全性问题,也会造成性能问题。 在JVM内存结构中,我们知道栈、程序计数器、局部变量这些是线程私有的,但是进程范围内的资源,同一个进程内的线程都会共享进程内的地址空间,那么它们会共享堆上分配的对象。当多个线程并发运行时,它们就可能会访问或者修改其他线程正在使用的变量造成严重的后果,比如我们在JMM笔记中提到的read-modify-write。那么在并发编程中,如果我们可以对要访问的资原创 2021-11-19 17:51:53 · 293 阅读 · 0 评论 -
并发编程——共享对象的正确使用
共享对象的正确使用概述 在JMM,Java内存模型中讲过,其实并发编程的问题主要在多线程对共享变量的修改读取上,那么互斥(加锁),其实是通过同步来避免多个线程在同一时刻访问共享变量,但是其实并不是所有的场景都需要加锁。比如并不是所有的场景都会更改共享变量的值,它们仅仅需要把主内存的数据读取出来,然后在工作内存中拷贝一份来读取(线程本地存储);也不是所有的场景都要求立马读取最新的数据(cop-on-write);甚至有些场景直接不共享变量的值—线程封闭;又或者这个变量的值永远都不会改变—不变模式。原创 2021-11-20 17:37:46 · 569 阅读 · 0 评论 -
线程篇——线程的生命周期
Java线程的生命周期 在Thread类中,我们可以看到有个内部枚举类State:/** * A thread state. A thread can be in one of the following states: * NEW A thread that has not yet started is in this state. * RUNNABLE A thread executing in the Java virtual machine is in this state. * BL原创 2021-11-14 12:22:29 · 73 阅读 · 0 评论 -
并发编程——并发编程之锁分类
锁锁模型 在前面JMM内存模型中有介绍过,其实原子性问题的源头是线程切换。如果我们把线程切换禁用了呢?单核CPU场景下好办,因为同一时刻单核就意味着只有一个线程执行,紧致CPU中断,那么操作系统就不会重新调度线程,也就禁止了线程切换。但是多核场景下,同一时刻可能有两个线程同时在执行。 同一时刻只有一个线程在执行这个条件就是我们说的互斥,如果不管在单核CPU还是多核CPU,我们都保证对共享变量的修改是互斥的,那么也就可以保证原子性了。 这就需要锁,简单的锁模型如下:临界区在图中演示的需要被原创 2021-11-21 12:17:37 · 827 阅读 · 0 评论