![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 93
Java_supermanNO1
这个作者很懒,什么都没留下…
展开
-
你的线程很可能出现了:安全性、活跃性以及性能问题
并发编程中我们需要注意的问题有很多,很庆幸前人已经帮我们总结过了,主要有三个方面,分别是:安全性问题、活跃性问题和性能问题。下面我就来一一介绍这些问题。安全性问题相信你一定听说过类似这样的描述:这个方法不是线程安全的,这个类不是线程安全的,等等。那什么是线程安全呢?其实本质上就是正确性,而正确性的含义就是程序按照我们期望的执行,不要让我们感到意外。在上一篇《深入底层探究并发编程Bug罪魁祸首——可见性、原子性、有序性 》中,我们已经见识过很多诡异的 Bug,都是出乎我们预料的,它们都没有按.原创 2021-03-20 22:41:38 · 216 阅读 · 0 评论 -
Java架构进阶笔记:一不小心就死锁了,怎么办?
我们用 Account.class 作为互斥锁,来解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,例如账户 A 转账户 B、账户 C 转账户 D 这两个转账操作现实世界里是可以并行的,但是在这个方案里却被串行化了,这样的话,性能太差。试想互联网支付盛行的当下,8 亿网民每人每天一笔交易,每天就是 8 亿笔交易;每笔交易都对应着一次转账操作,8 亿笔交易就是 8 亿次转账操作,也就是说平均到每秒就是近 1万次转账操作,若所有的转账操作都串行,性能完全不能接受。那下原创 2021-03-19 12:04:03 · 162 阅读 · 0 评论 -
深入底层探究并发编程Bug罪魁祸首——可见性、原子性、有序性
如果你细心观察的话,你会发现,不管是哪一门编程语言,并发类的知识都是在高级篇里。换句话说,这块知识点其实对于程序员来说,是比较进阶的知识。我自己这么多年学习过来,也确实觉得并发是比较难的,因为它会涉及到很多的底层知识,比如若你对操作系统相关的知识一无所知的话,那去理解一些原理就会费些力气。大家都知道,编写正确的并发程序是一件极困难的事情,并发程序的 Bug 往往会诡异地出现,然后又诡异地消失,很难重现,也很难追踪,很多时候都让人很抓狂。但要快速而又精准地解决“并发”类的疑难杂症,你就要理解这件事情的本质,原创 2021-03-10 21:09:57 · 203 阅读 · 0 评论 -
Java内存模型:看Java如何解决可见性和有序性问题
什么是 Java 内存模型?你已经知道,导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性、有序性最直接的办法就是禁用缓存和编译优化,但是这样问题虽然解决了,我们程序的性能可就堪忧了。合理的方案应该是按需禁用缓存以及编译优化。那么,如何做到“按需禁用”呢?对于并发程序,何时禁用缓存以及编译优化只有程序员知道,那所谓“按需禁用”其实就是指按照程序员的要求来禁用。所以,为了解决可见性和有序性问题,只需要提供给程序员按需禁用缓存和编译优化的方法即可。Java 内存模型是个很复杂的规范,可以从不原创 2021-03-09 22:33:50 · 161 阅读 · 0 评论 -
史前最详细的:Java线程池核心流程解析
1. 前言线程池是JAVA开发中最常使用的池化技术之一,可以减少线程资源的重复创建与销毁造成的开销。2. 灵魂拷问:怎么做到线程重复利用?很多同学会联想到连接池,理所当然的说:需要的时候从池中取出线程,执行完任务再放回去。如何用代码实现呢?此时就会发现,调用线程的start方法后,生命周期就不由父线程直接控制了。线程的run方法执行完成就销毁了,所谓的“取出”和“放回”只不过是想当然的操作。这里先说答案:生产者消费者模型3. ThreadPoolExecutor的实现3.1 结构首先看下原创 2021-03-03 22:54:01 · 309 阅读 · 1 评论 -
JAVA线程安全及性能的优化笔记(六)——Web服务器开发环境下的线程安全问题
本文转载自:JAVA线程安全及性能的优化笔记(六)——Web服务器开发环境下的线程安全问题Servlet是在多线程环境下的。即可能有多个请求发给一个servelt实例,每个请求是一个线程。struts下的action也 类似,同样在多线程环境下。可以参考struts user guide: http://struts.apache.org/struts-action/userGuide /b...原创 2020-04-15 17:04:49 · 278 阅读 · 0 评论 -
JAVA线程安全及性能的优化笔记(五)——ThreadLocal
本文转载自:JAVA线程安全及性能的优化笔记(五)——ThreadLocal一、ThreadLocal原理1. 线程程序介绍早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。2. Threadlocal变量ThreadLocal很容易让人望文生...原创 2020-04-13 14:34:59 · 453 阅读 · 0 评论 -
JAVA线程安全及性能的优化笔记(四)——什么是线程安全?
本文转载自:JAVA线程安全及性能的优化笔记(四)——什么是线程安全?如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。...原创 2020-04-08 20:17:26 · 310 阅读 · 0 评论 -
JAVA线程安全及性能的优化笔记(三)——Volatile关键字
本文转载自:JAVA线程安全及性能的优化笔记(三)——Volatile关键字volatile是java提供的一种同步手段,只不过它是轻量级的同步,为什么这么说?因为volatile只能保证多线程的内存可见性,不能保证多线程的执行有序性。而最彻底的同步要保证有序性和可见性,例如synchronized。任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都能及时写在主存。因此对于v...原创 2020-04-07 20:55:02 · 298 阅读 · 0 评论 -
JAVA线程安全及性能的优化笔记(二)——Synchronized关键字
本文转载自:JAVA线程安全及性能的优化笔记(二)——Synchronized关键字前面的文章说了,java用synchronized关键字作为多线程并发环境的执行有序性的保证手段之一。当一段代码会修改共享变量,这一段代码成为互斥区或临界区,为了保证共享变量的正确性,synchronized标志了临界区。典型的用法如下:synchronized(锁){ 临界代码}为了保证银行账户的安...原创 2020-04-07 14:49:06 · 234 阅读 · 0 评论 -
JAVA线程安全及性能的优化笔记(一)——JAVA内存模型
本文转载自:JAVA线程安全及性能的优化笔记(一)——JAVA内存模型不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的。其实JAVA的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题:可见性和有序性。我们都知道计算机有高速缓存的存在,处理器并不是每次处理数据都是取内存的。J...原创 2020-04-06 21:06:46 · 284 阅读 · 0 评论 -
阿里架构师实例讲解——Java多线程编程;详细的不能再详细了
本文转载自:阿里架构师实例讲解——Java多线程编程;详细的不能再详细了一、理解多线程多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。具体到java内存模型,由...原创 2020-03-31 21:46:16 · 355 阅读 · 0 评论 -
Java程序员升级必备:一文详解多线程之线程同步,从基础到进阶
本文转载自:Java程序员升级必备:一文详解多线程之线程同步,从基础到进阶Java 里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见性和有序性原子性。Java 实现线程同步有如下几种方式使用 synchronized 或 lock 锁使用volatile 修饰变量使用ThreadLocal使用J.U.C 的类库,如原子操作类、Semaphore信号量...原创 2020-02-07 17:37:16 · 479 阅读 · 0 评论 -
面试不慌!Java多线程面试题分享,吊打面试官你也可以!
本文转载自:面试不慌!Java多线程面试题分享,吊打面试官你也可以!1. volatile关键字在Java中有什么作用?volatile是一个特殊的修饰符,只有成员变量才能使用它。在Java并发程序缺少同步类的情况下,多线程对成员变量的操作对其它线程是透明的。volatile变量可以保证下一个读取操作会在前一个写操作之后发生。2. volatile 变量和 atomic 变量有什么不...原创 2019-12-28 20:57:09 · 225 阅读 · 0 评论 -
分享50道Java多线程高频面试题,面试不用愁
本文转载自:分享50道Java多线程高频面试题,面试不用愁1. 什么是进程?是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。2. 什么是线程?线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条...原创 2019-12-27 16:33:11 · 789 阅读 · 0 评论 -
还不懂Java多线程编程?那就来看看阿里资深Java架构师的熬夜总结
本文转载自:还不懂Java多线程编程?那就来看看阿里资深Java架构师的熬夜总结前言Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个...原创 2019-12-09 14:28:58 · 165 阅读 · 0 评论 -
Java程序员福利——阿里架构师详解Java多线程常用方法的使用
本文转载自:Java程序员福利——阿里架构师详解Java多线程常用方法的使用前言Java多线程的常用方法基本分为:获取当前线程的操作,线程休眠sleep()方法,线程让步yield()方法,等待其他线程终止join()方法,线程停止的一系列方法。一、获取当前线程的操作1、获取当前线程: Thread.currentThread();需要注意的是: 当一个线程A开启后,调用其他线程类B...原创 2019-10-23 16:00:31 · 216 阅读 · 0 评论 -
阿里Java面试题解析——多线程和并发面试题『源码解析』
本文转载自:阿里Java面试题解析——多线程和并发面试题『源码解析』1. DeplayQueue延时无界阻塞队列在谈到DelayQueue的使用和原理的时候,我们首先介绍一下DelayQueue,DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed元素。DelayQueue阻塞队列在我们系统开发中也常常会用到,例如:...原创 2019-10-23 15:01:47 · 369 阅读 · 0 评论 -
详解阿里Java面试题——多线程精选53题【含答案】,面试必备
本文转载自:详解阿里Java面试题——多线程精选53题【含答案】,面试必备前言为了能够在面试回答中优雅而不失体面回答面试考点,该文章借鉴了不同平台对知识点的描述。如有侵权请联系我文章的不足和错误请指正,好的建议也不要吝啬,我都会采纳并更正史上最强多线程面试53题【含答案】,点赞,转发,收藏一气呵成!金九银十虽已过去大半,但还有金三银四呀,最新整理的最全多线程并发面试53题和答案总...原创 2019-10-19 20:55:02 · 2911 阅读 · 0 评论 -
Java程序员面试跳槽涨薪必备——多线程和并发,面个阿里P6轻轻松
本文转载自:Java程序员面试跳槽涨薪必备——多线程和并发,面个阿里P6轻轻松一. ThreadLocal 的原理ThreadLocal 相当于一个容器, 用于存放每个线程的局部变量。 ThreadLocal 实例通常来说都是 private static 类型的。 ThreadLocal 可以 给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证 不同的线程都有一份拷贝。...原创 2019-10-15 15:44:32 · 437 阅读 · 1 评论 -
不会多线程还想进BAT?精选19道多线程面试题,有答案边看边学
本文转载自:不会多线程还想进BAT?精选19道多线程面试题,有答案边看边学一. Java程序如何停止一个线程?建议使用”异常法”来终止线程的继续运行。在想要被中断执行的线程中, 调用 interrupted()方法,该方法用来检验当前线程是否已经被中断,即该线程 是否被打上了中断的标记,并不会使得线程立即停止运行,如果返回 true,则 抛出异常,停止线程的运行。在线程外,调用 interr...原创 2019-10-15 15:12:47 · 184 阅读 · 0 评论 -
Java面试问题——线程全面详解总结
一、多线程是什么?为什么要用多线程?介绍多线程之前要介绍线程,介绍线程则离不开进程。首先进程 :是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元;线程:就是进程中的一个独立控制单元,线程在控制着进程的执行。一个进程中至少有一个进程。多线程:一个进程中不只有一个线程。为什么要用多线程:为了更好的利用cpu的资源,如果只有一个线程,则第二个...原创 2019-09-20 14:50:38 · 119 阅读 · 0 评论 -
Java并发——阿里架构师是如何巧用线程池的!
一、创建线程1.创建普通对象,只是在JVM的堆里分配一块内存而已2.创建线程,需要调用操作系统内核的API,然后操作系统需要为线程分配一系列资源,成本很高线程是一个重量级对象,应该避免频繁创建和销毁,采用线程池方案二、一般的池化资源// 假设Java线程池采用一般意义上池化资源的设计方法class ThreadPool { // 获取空闲线程 Thread acqu...转载 2019-09-21 20:26:02 · 133 阅读 · 0 评论 -
Java高并发——设计线程安全的类
将现有的线程安全的组件组合为更大规模的组件或程序。通过使用封装技术可以使得在不对整个程序进行分析的情况下就可以判断一个类是否是线程安全的。一. 基本要素1.1 找出对象状态的所有变量如果对象中所有的域都是基本类型的变量,那么这些域将构成对象的全部状态如果对象的域中引用了其他对象,那么改对象的状态包括被引用的对象的域final域越多越能简化对象可能状态的分析过程。1.2 找出约束状...原创 2019-09-25 14:51:59 · 259 阅读 · 0 评论 -
阿里架构师的Java总结篇系列——Java多线程(一)
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。一.线程的生命周期及五种基本状态关于Java中线程的生命周期,首先看一下下面这张较为经典的图:上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点,Java中的多线程也就基本上掌握了。主要包括:Java线程具有五中基本状态新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t ...原创 2019-09-27 16:03:25 · 207 阅读 · 0 评论 -
阿里架构师的Java总结篇系列——Java多线程(二)
四.Java多线程的阻塞状态与线程控制上文已经提到Java阻塞的几种具体类型。下面分别看下引起Java线程阻塞的主要方法。1.join()join —— 让一个线程等待另一个线程完成才继续执行。如A线程线程执行体中调用B线程的join()方法,则A线程被阻塞,知道B线程执行完为止,A才能得以继续执行。 public class ThreadTest { public static voi...原创 2019-09-27 16:08:30 · 103 阅读 · 0 评论 -
阿里架构师的Java总结篇系列——Java多线程(三)
一.一个典型的Java线程安全例子public class ThreadTest { public static void main(String[] args) { Account account = new Account("123456", 1000); DrawMoneyRunnable drawMoneyRunnable = new DrawMoneyRunnable(acc...原创 2019-09-27 16:16:40 · 152 阅读 · 0 评论 -
一文详解Java线程生命周期与状态切换
一、前提最近有点懒散,没什么比较有深度的产出。刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期、状态切换以及线程的上下文切换等等。编写本文的时候,使用的JDK版本是11。二、Java线程的实现在JDK1.2之后,Java线程模型已经确定了基于操作系统原生线程模型实现。因此,目前或者今后的JDK版本中,操作系统支持怎么样的线程模型,在很...原创 2019-09-19 14:43:58 · 130 阅读 · 0 评论